web-dev-qa-db-fra.com

Array.map 1 élément à plusieurs éléments

J'ai [3, 16, 120]. quand je fais [3, 16, 120].map(mapper), je veux réaliser, par exemple [4,5, 17,18, 121,122] c'est-à-dire que chaque élément mappe à n + 1 et n + 2. Ceci est bien sûr un exemple - ce que je veux, c'est simplement pousser plusieurs valeurs de la fonction mapper

Dois-je utiliser Array.each et Push vers un tableau, ou est-il possible de le faire avec Array.map (ou une autre API intégrée)

31
Boyang

Vous pouvez utiliser reduce() et ajouter au tableau e+1, e+2 de chaque élément.

var ar = [3, 16, 120];

var result = ar.reduce(function(r, e) {
  r.Push(e+1, e+2);
  return r;
}, []);

console.log(result)

Ceci est la version ES6 avec fonction flèche

var ar = [3, 16, 120];

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

PS: Array.Push semble être plus rapide et n'a pas de Maximum call stack.. erreur, voir ci-dessous:

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

Donc .Push est préférable par rapport à la solution acceptée.

33
Nenad Vracar

J'en invente un moi-même, en utilisant l'opérateur de propagation.

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

19
Boyang

Pas particulièrement sympa, mais c'est une solution possible:

var arr = [3, 16, 120];

console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
11
melpomene

vous pouvez produire un tableau pour chaque élément, puis concaténer tous ces tableaux:

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

Vous pouvez utiliser Array#reduce en combinaison avec 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), []));
4
Nina Scholz

Juste pour le plaisir, une solution ES6 avec générateur:

var arr = [3, 16, 120];

var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})();

console.log(result);
2
Me.Name

Solution immuable, avec l'opérateur spread:

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

en utilisant Array#concat et Array#map

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

En utilisant Array.prototype.flat ():

const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();

console.log(doubled)

Juste avertissement - pas une méthode standard à ce jour (publié le 12/2018).

1
HynekS