1
votes

Comment réorganiser un tableau d'objets en utilisant un tableau d'ordre?

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' }
]


1 commentaires

vous construisez votre propre tri personnalisé et passez la fonction personnalisée pour trier


3 Réponses :


2
votes

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);



3
votes

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)


0 commentaires

0
votes

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);


0 commentaires