web-dev-qa-db-fra.com

Utiliser es6 spread pour concatater plusieurs tableaux

Nous savons tous que vous pouvez faire:

let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5]

Mais comment faites-vous cette dynamique pour concaténer N tableaux?

15
danday74

Une option consiste à utiliser reduce:

let arrs = [[1, 2], [3, 4], [5, 6]];
arrs.reduce((a, b) => [...a, ...b], []);

Bien sûr, il s’agit d’une solution lente (temps quadratique). Si vous pouvez utiliser Lodash, _.flatten fait exactement ce que vous voulez et le fait plus efficacement (temps linéaire).

MODIFIER

Ou, adapté du commentaire de Xotic750 ci-dessous,

[].concat(...arrs);

Ce qui devrait être efficace (temps linéaire).

23
Brian McCutchon

Une autre option pourrait être:

const nArrays = [
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9],
  [10, 11]
];
const flattened = [].concat(...nArrays);
console.log(flattened)

8
acontell

let fruits = ["apples", "bananas", "pears"];
let vegetables = ["corn", "potatoes", "carrots"];

let produce = [...fruits, ...vegetables];


console.log(produce);

3
AJEET SINGH

La solution suivante fonctionne pour moi (opérateur de propagation dans ES6):

let array = ['my','solution','works'];
let newArray = [];
let newArray2 = [];
newArray.Push(...array); //adding to same array
newArray2.Push([...array]); //adding as child/leaf/sub-array
console.log(newArray);
console.log(newArray2);

2

Vous pouvez utiliser un élément spread dans la boucle for..of pour concaténer les valeurs d'un tableau en un seul tableau.

let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [];

for (let arr of [arr1, arr2 /* , arrN */]) arr3.Push(...arr);

console.log(arr3);

2
guest271314

Vous ne pouvez pas faire cela avec la syntaxe proprement dite uniquement, car elle vous oblige à connaître le nombre de tableaux que vous concaténez à l'avance. Cependant, vous pourriez écrire la fonction suivante:

function concatN(...arguments) {
    let accumulator = [];
    for(let arg = 0; arg < arguments.length; arg = arg + 1) {
        accumulator = [...accumulator, ...arguments[arg]];
    }
    return accumulator;
}

Cependant, cela ne sera probablement pas très efficace (l'utilisation répétée de la syntaxe spread est O (n²)). Utiliser Array.prototype.concat serait mieux. Vous pouvez juste faire:

[].concat(all, of, your, arrays);
2
Pedro Castilho

Vous pouvez utiliser une fonction récursive et Array.prototype.concat

const concatN = (x,...xs) =>
  x === undefined ? [] : x.concat(concatN(...xs))

console.log(concatN([1,2,3], [4,5,6], [7,8,9]))
// [1,2,3,4,5,6,7,8,9]

Vous pouvez faire la même chose en utilisant reduce et Array.prototype.concat. Ceci est similaire à la réponse acceptée mais n'utilise pas de manière inconsidérée la syntaxe répandue où x.concat(y) est parfaitement acceptable (et risque probablement plus rapidement)

const concatN = (...xs) =>
  xs.reduce((x,y) => x.concat(y), [])

console.log(concatN([1,2,3], [4,5,6], [7,8,9]))
// [1,2,3,4,5,6,7,8,9]

1
user633183

Selon es6 

function mergeTwo(arr1, arr2) {
  let result = [...arr1, ...arr2];
  return result.sort((a,b) => a-b);
}
0
KARTHIKEYAN.A