Trovare numeri pari o dispari
Sto cercando critiche per vedere cosa avrei potuto fare meglio o modi diversi in cui potrei avvicinarmi alla scrittura di una sceneggiatura per trovare numeri pari o dispari. Sono nuovo nella programmazione con JavaScript e nella programmazione in generale. Questa è una delle prime sfide che ho scritto per trovare numeri pari o dispari.
var numList = [];
while(numList.length < 5){
numList.push(window.prompt());
}
var evenNumbers = [];
numList.forEach(function(element){
if (element % 2 === 0){
evenNumbers.push(element);
}
})
document.write(evenNumbers);
Risposte
Puoi usare Array.prototype.filter .
Puoi leggere così: restituire un array che ha solo gli elementi che soddisfano l'espressione della funzione di ritorno.
In questo modo, puoi evitare di istanziare un array e solo dopo questa iterazione creare il file push
.
var numList = [];
while(numList.length < 5){
numList.push(window.prompt());
}
var evenNumbers = numList.filter(function (element) {
return element % 2 === 0
});
// that's the same that
// var evenNumbers = numList.filter(element => element % 2 === 0);
document.write(evenNumbers);
Tuttavia, puoi utilizzare le funzioni freccia , che hanno una sintassi più pulita.
Diversi modi per trovare numeri pari o dispari.
Mentre l'operatore modulo funziona bene per testare se un numero è pari o dispari, una tecnica più veloce (che non mi aspetterei che un principiante conosca) consiste nell'usare AND bit a bit - ie& . Fare riferimento a questo articolo per una spiegazione approfondita di come funziona .
function isEven(number) {
return !(number & 1);
}
for (let x = 0; x < 6; x++) {
console.log(x, ' is even: ', isEven(x));
}
Altri aspetti della revisione
Filtraggio dell'array
Come già accennato da Lucas Array.prototype.filter(), può essere utilizzato per semplificare l'aggiunta di elementi in evenNumbers
. Array.prototype.reduce()potrebbe essere utilizzato anche se non sarebbe così conciso in quanto ogni iterazione dovrebbe restituire l'array cumulativo e il valore iniziale dovrebbe essere impostato su un array.
Anche se non hai chiesto specificamente informazioni sulle prestazioni , se desideri che il codice sia il più efficiente possibile (ad esempio, verrà eseguito milioni (o più) volte in un breve lasso di tempo, evita gli iteratori, ad esempio tecniche funzionali con array.filter()
, array.map()
, così come i for...ofloop : usa un for
loop.
Dichiarazione di variabili
constpotrebbe essere utilizzato al posto di var
per evitare la riassegnazione accidentale per entrambi gli array e se le variabili fossero all'interno di un blocco, l'ambito sarebbe limitato al blocco. Si noti che "È possibile inserire elementi nell'array" 1 anche se è dichiarato con const
.
Promozione dell'utente per l'input
window.prompt()"visualizza una finestra di dialogo con un messaggio facoltativo che richiede all'utente di inserire del testo." 2 . Un messaggio amichevole potrebbe essere passato come primo argomento per fornire all'utente informazioni sull'input previsto, ad es
window.prompt(“Please enter a number”);
Inoltre:
Si noti che result è una stringa. Ciò significa che a volte dovresti lanciare il valore fornito dall'utente. Ad esempio, se la risposta deve essere un numero, dovresti eseguire il cast del valore su numero.
const aNumber = Number(window.prompt("Type a number", ""));
3
Quindi il Numbercostruttore potrebbe essere utilizzato per memorizzare i numeri nell'array.
numList.push(Number(window.prompt("Please enter a number")));
Invio dell'output condocument.write()
Nota : poiché
document.write()
scrive nel flusso di documenti , la chiamatadocument.write()
a un documento chiuso (caricato) chiama automaticamente document.open(), che cancellerà il documento .
4
Quindi non pianificare di utilizzare quella funzione su script che vengono eseguiti su pagine Web con elementi DOM esistenti nella pagina, per evitare che vengano rimossi.
Usa let ES6 invece di var
var numList = [];
let numList = [];
eccetera.
Usa il metodo del filtro
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
Come suggerito da Lucas Wauke
let evenNumbers = numList.filter(element => element % 2 === 0);
Dì all'utente cosa inserire nel prompt
numList.push(window.prompt());
numList.push(window.prompt("Please enter a whole number"));
Dovresti assolutamente lavorare sullo stile del tuo codice per renderlo più leggibile
Usa i rientri
while(numList.length < 5){ numList.push(window.prompt()); }
while(numList.length < 5){
numList.push(window.prompt());
}
Lascia gli spazi bianchi prima delle parentesi graffe
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
numList.forEach(function(element) {
if (element % 2 === 0) {
evenNumbers.push(element);
}
})
Secondo me è meglio leggibile se lasci uno spazio bianco tra parentesi.
Personalmente non conosco molte persone che lo fanno, ma provalo forse funziona per te
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
numList.forEach( function( element ) {
if ( element % 2 === 0 ) {
evenNumbers.push( element );
}
} )
Ciò è particolarmente utile quando si lavora con molte parentesi (pseudo codice):
method(function(method(getter())).setSomething(getSomethingFromSomewhere(somewhere)))
method( function( method( getter() ) ).setSomething( getSomethingFromSomewhere( somewhere ) ) )
Come puoi vedere è abbastanza facile vedere quali parentesi stanno insieme
Conclusione
Prima
var numList = []; while(numList.length < 5){ numList.push(window.prompt()); } var evenNumbers = []; numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } }) document.write(evenNumbers);
Dopo
let numList = [];
while ( numList.length < 5 ) {
numList.push( window.prompt() );
}
let evenNumbers = numList.filter(element => element % 2 === 0);
document.write( evenNumbers );