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
tripersonnalisé et passez la fonction personnalisée pour trier