sort objects multiple mdn fields array javascript map-function

javascript - objects - Array.map 1 elemento a elemento mĂșltiple



map callback (8)

Tengo [3, 16, 120] . cuando hago [3, 16, 120].map(mapper) , quiero lograr, por ejemplo [4,5, 17,18, 121,122] es decir, cada mapa de elementos a n + 1 y n + 2. Esto es, por supuesto, un ejemplo: lo que quiero es simplemente empujar varios valores desde la función del asignador

¿Tengo que usar Array.each y empujar a una matriz, o es posible hacerlo con Array.map (u otra api integrada)?


Esto me parece más simple, con el operador de propagación:

[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])


No particularmente agradable, pero es una posible solución:

var arr = [3, 16, 120]; console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));


Podría usar Array#reduce en combinación con Array#concat .

console.log([3, 16, 120].reduce(function (r, a) { return r.concat(a + 1, a + 2); }, []));

ES6

console.log([3, 16, 120].reduce((r, a) => r.concat(a + 1, a + 2), []));


Puede usar reduce() y agregar a la matriz e+1, e+2 de cada elemento.

var ar = [3, 16, 120]; var result = ar.reduce(function(r, e) { r.push(e+1, e+2); return r; }, []); console.log(result)

Esta es la versión ES6 con función de flecha.

var ar = [3, 16, 120]; var result = ar.reduce((r, e) => r.push(e+1, e+2) && r, []); console.log(result)

PS: Array.push parece ser más rápido y no tiene una Maximum call stack.. Error, vea a continuación:

a = Array(1000000).fill(1); st = Date.now(); Array.prototype.concat.apply([], a.map(function (n) { return [n+1, n+2]; })); console.log(`${Date.now() - st}ms `); > RangeError: Maximum call stack size exceeded a = Array(1000000).fill(1); st = Date.now(); a.reduce((r, e) => r.push(e+1, e+2) && r, []); console.log(`${Date.now() - st}ms `); > 180ms

Entonces .push es preferible en comparación con la solución aceptada.


Se me ocurre uno, utilizando el operador de propagación.

[].concat(...[3, 16, 120].map(x => [x+1, x+2]))


Solo por diversión, una solución ES6 con un generador:

var arr = [3, 16, 120]; var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})(); console.log(result);


podría producir una matriz para cada elemento y luego concentrar todas estas matrices:

[3, 16, 120].map(x => [x+1, x+2] ).reduce( (acc,val) => acc.concat(val), []);


usando Array#concat y Array#map

Array.prototype.concat.apply([], [3, 16, 120].map(x => [x+1, x+2] ));