Trovare numeri pari o dispari

Aug 21 2020

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

9 LucasWauke Aug 21 2020 at 07:55

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.

6 SᴀᴍOnᴇᴌᴀ Aug 21 2020 at 12:55

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 forloop.

Dichiarazione di variabili

constpotrebbe essere utilizzato al posto di varper 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 chiamata document.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.

5 RenéSchaar Aug 21 2020 at 14:03

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 );