javascript tri tableau fragmenté garder les index
Quelle est la meilleure méthode pour trier un tableau fragmenté et garder les éléments sur le même index?
Par exemple:
a[0] = 3,
a[1] = 2,
a[2] = 6,
a[7] = 4,
a[8] = 5,
Je voudrais une fois le tri pour avoir
a[0] = 2,
a[1] = 3,
a[2] = 4,
a[7] = 5,
a[8] = 6.
- Peut-être que vous pourriez essayer de google avec les mots clés: "trier", 'tableau associatif', 'par la valeur" si je comprends bien votre question.
Vous devez vous connecter pour publier un commentaire.
Voici une approche. Il copie la définition des éléments d'un tableau à un autre tableau et enregistre leurs index. Il trie le tableau, puis place le tri résultats dans les indices qui ont été utilisés précédemment.
De travail de démonstration: http://jsfiddle.net/jfriend00/3ank4/
.sort()
?if (arr[i] !== undefined)
devrait êtreif (arr.hasOwnProperty(i))
. Au moins, il n'est pas fiable pour les tableaux avec les membres dont la valeur est undefined.undefined
, soit parce qu'elle est clairsemée ou parce que la cellule possède une valeur deundefined
. Dans les deux cas, je suis en essais et en évitant les éléments (ne pas toucher), et seulement le tri de ceux qui ont réellement une valeur. Oui, je suis en supposant que l'OP n'a pas besoin de trier tout ce qui a une valeur deundefined
.[undefined,,3]
devrait devenir[3,,undefined]
mais votre fonction laisse comme[undefined,,3]
.undefined
si c'est des rapports que parce qu'il est dispersé (élément n'existe pas) ou parce que l'élément existe, mais a unundefined
valeur. C'est l'un, légitime façon de traiter avecundefined
valeurs. Votre méthode en est une autre. On ne peut pas vraiment dire que l'une est meilleure que l'autre, cela dépend de ce que vous voulez et que l'OP n'a pas de spécifier (ou semblent soins).if
conparison, mais il a la charge d'un appel de fonction pour les non-cellules vides.Vous pouvez
filtre
oude l'Objet.les valeurs de
pour obtenir un tableau avec les valeurs de votre tableau fragmenté.sort
ce tableau, du plus grand au plus petit. Être conscient qu'elle n'est pas stable, ce qui peut être particulièrement problématique si certaines valeurs ne sont pas numériques. Vous pouvez utiliser votre propre tri de mise en œuvre.map
etpop
pour obtenir le tableau désiré. L'attribuer àa
.Ou, dans ECMAScript 2017,
b
n'est pas nécessaire dans l'ES5 code, mais je l'ai utilisé pour rendre le code plus lisible.a
est pas modifié si affecter lamap
de retour pour une nouvelle variable. Beau travail, Oriol. Je déteste que[].sort
de mutation par défaut.a.filter(() => true)
ouObject.values(a)
.filter
utilise HasProperty ignorer non des propriétés existantes.