La meilleure façon de regrouper des éléments de tableau adjacent par valeur

Supposons que nous avons une gamme de valeurs:

[5, 5, 3, 5, 3, 3] 

Quelle est la meilleure façon de les regrouper en valeur et en adjacence. Le résultat devrait être le suivant:

 [ [5,5], [3], [5], [3,3] ] 

Bien sûr, je peux parcourir le réseau source et rechercher l'élément suivant / précédent, et s'ils sont identiques, les pousser vers un tableau temporaire qui sera ensuite envoyé au tableau résultant.

Mais j'aime écrire du code de manière fonctionnelle. Alors peut-être qu'il pourrait y avoir une meilleure façon?

Vous pouvez utiliser la méthode Array.prototype.reduce :

 var result = [5, 5, 3, 5, 3, 3].reduce(function(prev, curr) { if (prev.length && curr === prev[prev.length - 1][0]) { prev[prev.length - 1].push(curr); } else { prev.push([curr]); } return prev; }, []); alert( JSON.stringify(result) ); 

Si vous parlez de performance , n – complexité [O (n)] est ce que vous obtiendrez (l'itération dont vous parlez).

Si vous parlez de l' optimisation de l'utilisation de la mémoire , vous voudrez peut-être pousser / pop les objets (ne pas les doubler). Ou essayez d'organiser votre tableau de saisie en tant que tableau de tableaux lors de sa première création (p. Ex. [[5], [5], [3], [5], [3], [3]]) et ne travaillez que sur cette Array, pour le façonner à la forme de fin que vous souhaitez.

Si vous voulez être plus chic dans votre implémentation, vous pouvez essayer de mettre en œuvre une fonction récursive pour la traiter (mais, en règle générale, entre deux implémentations qui offrent la même performance, celle qui est plus simple à lire est celle Vous devriez viser).