Quel est le moyen le plus efficace pour concaténer des N matrices?
Quel est le moyen le plus efficace pour concaténer N les tableaux d'objets en JavaScript?
Les tableaux sont mutables, et le résultat peut être stocké dans un des tableaux.
- double possible de Merge/aplatir un Tableau de Tableaux en JavaScript?
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la concaténation de plus de deux matrices,
concat()
est le chemin à parcourir pour plus de commodité et de performance.Pour concaténer le juste deux tableaux, le fait que
push
accepte plusieurs arguments composé d'éléments à ajouter à l'éventail peut être utilisé au lieu d'ajouter des éléments d'un tableau à la fin de l'autre, sans la production d'un nouveau tableau. Avecslice()
il peut également être utilisé à la place deconcat()
mais il semble y avoir aucun avantage en termes de performances de faire ce.Dans ECMAScript 2015 et plus tard, ce peut être encore réduite à
Cependant, il semble que pour les tableaux de grande taille (de l'ordre de 100 000 membres ou plus), la technique du passage d'un tableau d'éléments de
push
(soit à l'aide deapply()
ou ECMAScript 2015 la propagation de l'opérateur) peut échouer. Pour ces tableaux, à l'aide d'une boucle est une meilleure approche. Voir https://stackoverflow.com/a/17368101/96100 pour plus de détails.a.concat(b)
cas de test semble être inutilement de faire une copie du tableaua
puis de le jeter.concat()
est généralement plus rapide. Pour le cas de la concaténation d'un tableau sur une matrice existante en place,push()
est le chemin à parcourir. J'ai mis à jour ma réponse.[1,2,3].concat([4,5,6])
choses) et de fairefor(var i = 0, n = arr2.length; i < n; i++) arr1.push(arr2[i]);
semble être la manière la plus rapide de toute méthode que j'ai vu jusqu'à présent pour plus grands ensembles de données.while(b.length) a.push(b.splice(0,1)[0]);
parce qu'il est presque aussi rapide, mais ressemble beaucoup carde 😀a.push.apply(a,b)
concat
crée un nouveau tableau, en laissant les originaux intacts, c'est pourquoi il est plus lent que simplement en ajoutant de nouveaux éléments et elle crée aussi plus Umemory ordures sont collectées. Bâton avecpush
, sauf si vous avez réellement besoin d'une nouvelle marque d'objet tableau.concat
est a été plus lent que d'utiliserpush
. codeburst.io/...modifier: la preuve de son efficacité: http://jsperf.com/multi-array-concat/7
edit2: Tim Supinie mentionne dans les commentaires que cela peut entraîner l'interprète de dépasser la taille de la pile d'appel. C'est peut-être dépend de la js moteur, mais j'ai aussi eu "Maximale de la pile d'appels de taille dépassé" sur Chrome au moins. Cas de Test:
[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (J'ai aussi eu le même message d'erreur à l'aide de la accepté de répondre, de manière à anticiper de tels cas d'utilisation ou de la construction d'une bibliothèque pour les autres, des tests spéciaux peuvent être nécessaires n'importe quelle solution vous choisissez.)apply
avec un tableau vide en tant que premier paramètre??? pourquoi ne pas simplement utiliservar result = [].concat(arr1, arr2, ..., arrN)
?????[].concat.apply([], arrays)
à l'intérieur d'unfunction concatArray(arrays) {...}
.[[1,2,3]]
sans s'en rendre compte. Sinon, vous pourriez parler de votre JS interprète ou le navigateur si elle n'a pas de travail et de test.La
concat()
méthode est utilisé pour joindre deux ou plusieurs tableaux. Il ne change pas les tables existantes, il ne renvoie une copie de la rejoint tableaux.Pour les personnes utilisant ES2015 (ES6)
Vous pouvez maintenant utiliser la Propagation de la Syntaxe pour concaténer deux tableaux:
Utilisation De Tableau.le prototype.concat.s'appliquent à gérer plusieurs matrices de concaténation:
Exemple:
Si vous êtes dans le milieu de la tuyauterie, le résultat par le biais de la carte/filtre/tri, etc et vous souhaitez concat tableau de tableaux, vous pouvez utiliser
reduce
Pour le tableau de multiples tableaux et ES6, utilisez
Par exemple:
newArr = Array.from(new Set(newArr));
.Maintenant, nous pouvons combiner plusieurs tableaux à l'aide de
ES6
Spread
.Au lieu d'utiliser
concat()
pour concaténer des tableaux, essayez d'utiliser la propagation de la syntaxe de combiner plusieurs tableaux en un seul aplatie tableau.par exemple:
Facilement avec la fonction concat:
Vous pouvez utiliser jsperf.com site pour comparer les performances. Voici le lien pour concat.
Ajouté comparaison entre:
et:
La deuxième est près de 10 fois plus lent dans google chrome.
push.apply()
, qui semble être plus rapide queconcat()
dans tous les navigateurs, sauf Chrome. Voir ma réponse.résolu comme ça.
Voici une fonction qui vous permet de concaténer plusieurs nombre de tableaux
Exemple -
sortie
Si vous avez tableau de tableaux et souhaitez concat les éléments dans un tableau unique, essayez le code suivant (Nécessite ES2015):
Ou si vous êtes en programmation fonctionnelle
Ou encore mieux avec ES5 syntaxe, sans la propagation de l'opérateur
De cette façon est très pratique si vous ne connaissez pas le pas. de tableaux dans le code de temps.
Diminuer avec l'ES6.
Cela ne concat et unique les multiples tableaux;
Démo sur codepen
où 'n' est un certain nombre de tableaux, peut-être un tableau de tableaux . . .
var reponse = _.réduire(n, la fonction(a, b){ return a.concat(b)})
Si il y a seulement deux tableaux à concat, et vous avez réellement besoin de ajouter l'un des tableaux plutôt que d'en créer un nouveau, de la pousser ou de la boucle est le chemin à parcourir.
Référence: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
De fusion de la Matrice de avec Push:
JS:
À l'aide de Concat et Propagation de l'opérateur:
JS:
essayez ceci:
si la N des tableaux sont obtenus à partir de la base de données et pas codé en dur, la je vais le faire comme ceci en utilisant ES6