J'ai besoin de remplir un tableau d'identifiants avec des objets. En d'autres termes, je l'ai. Tableau d'identifiants:

var orderArray = ["5ace454a2b22e17597d0e694", "5acde7c0f7d2520e3b205971", "5ad2086bf05ad342dc723ea1"]

Et tableau d'objets:

var objectsArray = [ { _id: 5acde7c0f7d2520e3b205971,
    name: 'Dinner',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    created: 2018-04-11T10:47:28.957Z,
    status: true,
    products: [ [Object] ] },
  { _id: 5ace454a2b22e17597d0e694,
    name: 'Test',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    image: 
     { _id: 5ad23ed177bcd07303f62899,
       filename: 'rJKCR2k2f-1523728081111.jpeg',
       destination: 'images',
       binded: true },
    created: 2018-04-11T17:26:34.186Z,
    status: false,
    products: [ [Object], [Object] ] },
  { _id: 5ad2086bf05ad342dc723ea1,
    name: 'Test',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    image: null,
    created: 2018-04-14T13:55:55.449Z,
    status: true,
    products: [] } ]

Soit vous pouvez trier un tableau d'objets en fonction des identifiants ... Ou mapper un tableau d'identifiants sur un tableau d'objets. Je préférerais probablement la deuxième option. Mais mon approche ne fonctionne tout simplement pas

orderArray.map(id => objectsArray.filter(obj => obj._id == id))

Le résultat doit être : objectsArray est trié par ordre d'éléments dans orderArray

SOLUTION: j'ai ouvert cette question il y a quelques jours: Fusion de 2 tableaux avec différents types de valeurs

Ici, j'ai le même problème. orderArray est un tableau d'objets (pas une chaîne) donc pour le faire fonctionner, j'ai besoin d'appliquer la solution que j'ai trouvée plus tôt (les fonctions Array.filter et Array.find fonctionnent bien): mais à ma façon, cela ne fonctionnera que si:

order_array.map(String).map(e => objectsArray.find(a => a._id == e))
//as well as 
order_array.map(String).map(e => objectsArray.filter(a => a._id == e))
1
Timothy 14 avril 2018 à 23:39

3 réponses

Meilleure réponse

map le premier tableau à le remplir avec les éléments correspondants du second:

var orderArray = ["5ace454a2b22e17597d0e694", "5acde7c0f7d2520e3b205971", "5ad2086bf05ad342dc723ea1"]

var objectsArray = [ { _id: '5acde7c0f7d2520e3b205971',
    name: 'Dinner',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    created: '2018-04-11T10:47:28.957Z',
    status: true,
    products: [ [Object] ] },
  { _id: '5ace454a2b22e17597d0e694',
    name: 'Test',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    image: 
     { _id: '5ad23ed177bcd07303f62899',
       filename: 'rJKCR2k2f-1523728081111.jpeg',
       destination: 'images',
       binded: true },
    created: '2018-04-11T17:26:34.186Z',
    status: false,
    products: [ [Object], [Object] ] },
  { _id: '5ad2086bf05ad342dc723ea1',
    name: 'Test',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    image: null,
    created: '2018-04-14T13:55:55.449Z',
    status: true,
    products: [] } ]
    
 var sorted = orderArray.map((e) => { return objectsArray.find((a) => { return a._id  == e})})
 
 console.log(sorted)
4
Taki 14 avril 2018 à 20:45

En utilisant map / find (au lieu de filter):

let mappedArray = orderArray.map(id => objectsArray.find(obj => obj._id == id));

Qui map est orderArray à un tableau d'objets, où il find est l'objet de objectsArray qui a le même _id que l'actuel {{X5} }.

Remarque: s'il n'y a pas d'objet dans objectsArray qui correspond à id, null sera retourné.

0
ibrahim mahrir 14 avril 2018 à 20:46

Tu devrais être capable de:

ObjectsArray.filter (obj => OrdersArray.includes (obj._id));

Si je comprends bien.

1
andy729 14 avril 2018 à 20:45