Encontrar números pares o impares

Aug 21 2020

Estoy buscando críticas para ver qué podría haber hecho mejor o diferentes formas en las que podría abordar la escritura de un guión para encontrar números pares o impares. Soy nuevo en la programación con JavaScript y en la programación en general. Este es uno de los primeros desafíos que escribí para encontrar números pares o impares.

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

Respuestas

9 LucasWauke Aug 21 2020 at 07:55

Puede usar Array.prototype.filter .

Puede leer así: devuelva una matriz que solo tenga los elementos que satisfagan la expresión de la función de retorno.

De esta manera, puede evitar instanciar una matriz y solo después de esta iteración para hacer el 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);

Aunque, puede usar funciones de flecha , que tiene una sintaxis más limpia.

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

Diferentes formas de encontrar números pares o impares.

Si bien el operador de módulo funciona bien para probar si un número es par o impar, una técnica más rápida (que no esperaría que un principiante conozca) es usar AND bit a bit, es decir& . Consulte este artículo para obtener una explicación detallada de cómo funciona .

function isEven(number) {
     return !(number & 1);
}
for (let x = 0; x < 6; x++) {
    console.log(x, ' is even: ', isEven(x));
}

Otros aspectos de revisión

Filtrado de la matriz

Como Lucas ya mencionó Array.prototype.filter(), se puede usar para simplificar la adición de elementos en evenNumbers. Array.prototype.reduce()podría usarse aunque no sería tan conciso ya que cada iteración necesitaría devolver la matriz acumulativa, y el valor inicial debería establecerse en una matriz.

Si bien no preguntó específicamente sobre el rendimiento , si desea que el código sea lo más eficiente posible (por ejemplo, se ejecutará millones (o más) de veces en un corto período de tiempo, evite iteradores, por ejemplo, técnicas funcionales con array.filter(), array.map(), así como for...ofbucles : use un forbucle.

Declaración de variables

constpodría usarse en lugar de varpara evitar la reasignación accidental de ambas matrices, y si las variables estuvieran dentro de un bloque, el alcance se limitaría al bloque. Tenga en cuenta que "Es posible insertar elementos en la matriz" 1 incluso si se declara con const.

Promoción de usuario para la entrada

window.prompt()"muestra un cuadro de diálogo con un mensaje opcional que solicita al usuario que ingrese algún texto". 2 . Se podría pasar un mensaje amigable como primer argumento para brindar al usuario información sobre la entrada esperada, por ejemplo

window.prompt(“Please enter a number”);

Además:

Tenga en cuenta que el resultado es una cadena. Eso significa que a veces debe emitir el valor dado por el usuario. Por ejemplo, si su respuesta debe ser un Número, debe convertir el valor en Número.

  const aNumber = Number(window.prompt("Type a number", ""));

3

Entonces, el Numberconstructor podría usarse para almacenar números en la matriz.

numList.push(Number(window.prompt("Please enter a number")));

Envío de salida condocument.write()

Nota : debido a que document.write()escribe en el flujo de documentos , llamar document.write()a un documento cerrado (cargado) llama automáticamente a document.open(), que borrará el documento .

4

Por lo tanto, no planee usar esa función en scripts que se ejecutan en páginas web con elementos DOM existentes en la página, para que no se eliminen.

5 RenéSchaar Aug 21 2020 at 14:03

Use let ES6 en lugar de var

var numList = [];
let numList = [];

etc.

Usa el método de filtrado

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
}) 

Según lo sugerido por Lucas Wauke

let evenNumbers = numList.filter(element => element % 2 === 0);

Dígale al usuario qué ingresar en el indicador

numList.push(window.prompt());
numList.push(window.prompt("Please enter a whole number"));

Definitivamente deberías trabajar en el estilo de tu código para que sea más legible.

Usar sangrías

while(numList.length < 5){
numList.push(window.prompt());
}
while(numList.length < 5){
    numList.push(window.prompt());
}

Dejar espacios en blanco antes de las llaves

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
})
 numList.forEach(function(element) {
     if (element % 2 === 0) { 
         evenNumbers.push(element);
     }
 })

En mi opinión, es mucho más legible si dejas un espacio en blanco entre paréntesis.

Personalmente, no conozco a muchas personas que hagan esto, pero pruébalo, tal vez funcione para ti.

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
})
 numList.forEach( function( element ) {
     if ( element % 2 === 0 ) { 
         evenNumbers.push( element );
     }
 } )

Esto es especialmente útil cuando se trabaja con muchos paréntesis (pseudocódigo):

method(function(method(getter())).setSomething(getSomethingFromSomewhere(somewhere)))
method( function( method( getter() ) ).setSomething( getSomethingFromSomewhere( somewhere ) ) )

Como puede ver, es bastante fácil ver qué paréntesis van juntos.

Conclusión

Antes

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

Después

let numList = [];

while ( numList.length < 5 ) {
    numList.push( window.prompt() );
}

let evenNumbers = numList.filter(element => element % 2 === 0);

document.write( evenNumbers );