Estoy aprendiendo ES6 y el siguiente es mi código ES5 que funciona bien,
var myArr = [34,45,67,34,2,67,1,5,90]; var evenArr = []; var oddArr = []; myArr.map(function(x){ if(x%2==0) evenArr.push(x); else oddArr.push(x); });
Ahora, si estoy convirtiendo esto a ES6, estoy recibiendo errores de Unexpected token
, if
, hágamelo saber lo que estoy haciendo mal aquí –
Mi código ES6 –
var myArr = [34,45,67,34,2,67,1,5,90]; var evenArr = []; var oddArr = []; myArr.map( x => if(x%2==0) evenArr.push(x) else oddArr.push(x) )
Esto se debe a que las funciones de flecha aceptan expresiones mientras pasa una instrucción .
Su código es engañoso: Array.prototype.map
implica que usaría el resultado de alguna manera, mientras que usted no lo está.
Si quisieras mejorar la semántica de tu código, Array.prototype.forEach
que está diseñado específicamente para iterar sobre una matriz y no devolver nada:
var myArr = [34,45,67,34,2,67,1,5,90]; var evenArr = []; var oddArr = []; myArr.forEach(x => { if (x % 2 === 0) { evenArr.push(x); } else { oddArr.push(x); } });
Referencias
Array.prototype.forEach()
Debe usar un operador ternario para las condiciones en línea.
myArr.map( x => x%2==0 ? evenArr.push(x) : oddArr.push(x) )
Si no usa corchetes para definir el cuerpo de las funciones de flecha, el cuerpo debería ser una expresión. En su caso, no es expresión, sino una statement if
.
Necesitas definirlo con el cuerpo compuesto, como este
myArr.map(x => { if (x % 2 === 0) evenArr.push(x); else oddArr.push(x); })
O debería definirlo para devolver una expresión, como esta
myArr.map(x => x%2==0 ? evenArr.push(x) : oddArr.push(x))
Nota: No debe usar el map
para hacer esto. map
debe usarse solo cuando necesite crear una nueva matriz a partir de los valores de otra matriz. Debe usar forEach
, cuando se trata de funciones que tienen efectos secundarios. En su caso, está modificando objects que están fuera del scope de su function. Así que para cada forEach
sería la mejor forEach
aquí.
Si un cuerpo de function de flecha contiene más de una instrucción, debe estar contenida en un bloque. Además, no puede omitir punto y coma así.
forEach es más semántico (ya que su function simplemente devuelve indefinido y no conserva la nueva matriz de todos modos) y puede usar el valor de x%2
directamente:
myArr.forEach( x => {if(x%2) oddArr.push(x); else evenArr.push(x)} )
y también hay:
myArr.forEach(x => [evenArr,oddArr][x%2].push(x));
var myArr = [34,45,67,34,2,67,1,5,90]; var evenArr = []; var oddArr = []; myArr.map( x => (x%2==0)? evenArr.push(x) : oddArr.push(x) )
Prueba el código de arriba. Parece funcionar.
Acabo de replace if..else
con operador ternario ( ? :
if..else
.