J'ai besoin de réorganiser certains objets dans un tableau.
Supposons que ce soit mon tableau de données:
data.forEach(d => { order.indexOf(d.id) // get new index // but how to reorder the array? })
Et il y a un autre tableau, qui représente le nouvel ordre:
[ { id: 'McfTB40vO', name: 'item 2', value: 'value 2' }, { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' } ]
Comme vous pouvez le voir, le deuxième élément occupe la première place.
Le résultat devrait donc être:
const order = [ 'McfTB40vO', 'ETHUVMY0m' ]
J'ai pensé à utiliser une boucle forEach:
const data = [ { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' }, { id: 'McfTB40vO', name: 'item 2', value: 'value 2' } ]
3 Réponses :
Si vous voulez le faire immuablement, utilisez map et find, pas forEach:
const data = [ { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' }, { id: 'McfTB40vO', name: 'item 2', value: 'value 2' } ]; const order = [ 'McfTB40vO', 'ETHUVMY0m' ]; const result = order.map(id => data.find(x => x.id === id)); console.log(result);
Si vous reduction () code>
ordre
dans un Map
avant d'utiliser Array.prototype.map ()
, vous pouvez effectuer cela dans O (n) en utilisant Map.prototype.has ()
a > au lieu de Array.prototype.find ()
.
@PatrickRoberts Je ne comprends pas ce que vous suggérez. Pouvez-vous donner un exemple?
@ user3142695, regardez la réponse d'Ori Drori pour une solution utilisant Map.get ()
, qui est plus efficace que d'utiliser find ()
Convertissez les données
en Carte des objets par id
. Puis utilisez Array.map ()
sur le tableau order
, et récupérez l'élément pertinent de la carte:
const data = [ { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' }, { id: 'McfTB40vO', name: 'item 2', value: 'value 2' } ] const order = [ 'McfTB40vO', 'ETHUVMY0m' ] const dataMap = new Map(data.map(o => [o.id, o])) const result = order.map(id => dataMap.get(id)) console.log(result)
Vous pouvez mapper
sur order
:
const data = [{ id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' }, { id: 'McfTB40vO', name: 'item 2', value: 'value 2' } ] const order = ['McfTB40vO', 'ETHUVMY0m'] const output = order.map(d => data.find(({ id }) => d == id)); console.log(output);
vous construisez votre propre
tri
personnalisé et passez la fonction personnalisée pour trier