Il existe deux tableaux:
[ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 3}, {"id": "344430b94t4t34rwefewfdff", "quantity": 6}, {"id": "342343343t4t34rwefewfd53", "quantity": 3} ]
et
[ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 2}, {"id": "344430b94t4t34rwefewfdff", "quantity": 1} ]
Comment les combiner en une seule quantité de somme?
[ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 1}, {"id": "344430b94t4t34rwefewfdff", "quantity": 5}, {"id": "342343343t4t34rwefewfd53", "quantity": 3} ]
L'un d'eux peut parfois être vide
5 Réponses :
Pour ce faire, vous pouvez simplement réduire:
let a1 = [ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 2}, {"id": "344430b94t4t34rwefewfdff", "quantity": 1} ]; let a2 = [ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 1}, {"id": "344430b94t4t34rwefewfdff", "quantity": 5}, {"id": "342343343t4t34rwefewfd53", "quantity": 3} ]; let result = Object.values(a1.concat(a2).reduce((acc, v) => { if (!acc[v.id]) { acc[v.id] = {id: v.id, quantity: 0}; } acc[v.id].quantity += v.quantity; return acc; }, {})); console.log("Results: ", result);
Vous pouvez le faire avec du JavaScript brut.
Utilisez Array.reduce ()
pour faire un dictionnaire intermédiaire par id et accumuler les quantités, puis le transformer en tableau avec Object.values ()
:
const arr1 = [ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 1}, {"id": "344430b94t4t34rwefewfdff", "quantity": 5}, {"id": "342343343t4t34rwefewfd53", "quantity": 3} ]; const arr2 = [ {"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 2}, {"id": "344430b94t4t34rwefewfdff", "quantity": 1} ]; const result = Object.values([...arr1, ...arr2].reduce((acc, { id, quantity }) => { acc[id] = { id, quantity: (acc[id] ? acc[id].quantity : 0) + quantity }; return acc; }, {})); console.log(result);
Vous pouvez utiliser du lodash, mais le JS vanilla moderne est tout aussi viable et performant. J'imagine que les autres réponses utiliseront des méthodes fonctionnelles comme réduire
, alors voici une version qui utilise une simple boucle for / of
avec find
plutôt qu'une recherche dans le dictionnaire qui pourrait être plus long, mais c'est un peu plus facile à suivre.
const arr1 = [{"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 1}, {"id": "344430b94t4t34rwefewfdff", "quantity": 5}, {"id": "342343343t4t34rwefewfd53", "quantity": 3}]; const arr2 = [{"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 2}, {"id": "344430b94t4t34rwefewfdff", "quantity": 1}]; function merge(arr1, arr2) { // Merge the arrays, and set up an output array. const merged = [...arr1, ...arr2]; const out = []; // Loop over the merged array for (let obj of merged) { // Destructure the object in the current iteration to get // its id and quantity values const { id, quantity } = obj; // Find the object in out that has the same id const found = out.find(obj => obj.id === id); // If an object *is* found add this object's quantity to it... if (found) { found.quantity += quantity; // ...otherwise push a copy of the object to out } else { out.push({ ...obj }); } } return out; } console.log(merge(arr1, arr2));
Version avec des clés d'objet supplémentaires. Le corps de la fonction n'interfère pas avec quel objet a des propriétés. Donc additionnez par "qty" et vérifiez par "prop"
var first = [ {quantity:100, id:1, variantId: 1}, {quantity:300, id:2, variantId: 2, propA: 'aaa'}, ]; var second = [ {quantity:100, id:1, variantId: 1}, {quantity:200, id:2, variantId: 2, propB: true}, {quantity:300, id:3, variantId: 3, propC: 'ccc'}, ] function mergeArrays(arrayOfArrays, propToCheck, propToSum) { let sum = []; [].concat(...arrayOfArrays).map(function(o) { let existing = sum.filter(function(i) { return i[propToCheck] === o[propToCheck] })[0]; if (!existing) { sum.push(o); } else { existing[propToSum] += o[propToSum]; let copyProps = Object.keys(o).filter(obj => { return existing[obj] !== o[obj] }).map(val => (val !== propToSum) ? existing[val] = o[val] : null) } }); return sum; } console.log(mergeArrays([first, second], 'variantId', 'quantity'))
Vous pouvez utiliser les méthodes .reduce et .find pour y parvenir.
const arr1 = [{"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 1}, {"id": "344430b94t4t34rwefewfdff", "quantity": 5}, {"id": "342343343t4t34rwefewfd53", "quantity": 3}]; const arr2 = [{"id": "5c5030b9a1ccb11fe8c321f4", "quantity": 2}, {"id": "344430b94t4t34rwefewfdff", "quantity": 1}]; const result = [...arr1, ...arr2].reduce((accumulator, currentValue) => { const element = accumulator.find(item => item.id === currentValue.id) element ? element.quantity += currentValue.quantity : accumulator.push(currentValue) return accumulator },[]) console.log(result)
Vous devez ajouter le code que vous avez essayé.
reportez-vous au lien suivant [Merge Arrays] ( samanthaming.com/tidbits / 49-2-façons-de-fusionner-des-tableaux )