J'ai deux listes de tableaux list1
et list2
, la propriété name
correspond, puis additionne toutes les qty
de objet correspondant list1 et list2, retourne la quantité mise à jour de list1
[ {id:1, name: "IN",qty: 3}, {id:2, name: "TH", qty: 2}, {id:3, name: "AU"} ]
Résultat attendu:
function resultantArray(list1, list2){ let sum = list2.map(o => o.qty|| 0).reduce((a, c) => { return a + c }); list1.forEach(item=>{ list2.find(elm => elm.productcode == item.productcode).qty= sum; }); } var list1 = [ {id:1, name: "IN",qty: 1}, {id:2, name: "TH"}, {id:3, name: "AU"} ] var list2 = [ {id:3, name: "IN", qty:1}, {id:5, name: "IN", qty:1}, {id:4, name: "TH", qty: 2}, {id:1, name: "SG", qty: 3} ]
3 Réponses :
var list1 = [ {id:1, name: "IN",qty: 1}, {id:2, name: "TH"}, {id:3, name: "AU"} ] var list2 = [ {id:3, name: "IN", qty:1}, {id:5, name: "IN", qty:1}, {id:4, name: "TH", qty: 2}, {id:1, name: "SG", qty: 3} ] function process(l1, l2) { let qtys = {}; l1.concat(l2).forEach(o => { let q = o.qty || 0; if (qtys[o.name] === undefined) { qtys[o.name] = o.qty; // track its qty } else { qtys[o.name] += o.qty; // add its qty } }); let id = 1; return l1.map(o => { let r = {id: id++, name: o.name}; if (qtys[o.name]) r.qty = qtys[o.name]; return r; }); } console.log(JSON.stringify(process(list1, list2)));
Cela semble résoudre le problème. La première boucle forEach
additionne toutes les quantités. La deuxième boucle construit le résultat en recherchant uniquement les entrées dans list1
. Notez que cela ne fonctionne comme prévu que s'il n'y a pas de doublons dans list1
.
Vous pouvez également utiliser la fonction map
, la logique serait de filtrer l'élément de la deuxième liste et d'obtenir la longueur et d'en ajouter une pour être l'élément actuel, ensuite si la quantité code> est plus d'un puis enregistrez en conséquence. Voici l'exemple de travail:
var list1 = [
{id:1, name: "IN",qty: 1},
{id:2, name: "TH"},
{id:3, name: "AU"}
]
var list2 = [
{id:3, name: "IN", qty:1},
{id:5, name: "IN", qty:1},
{id:4, name: "TH", qty: 2},
{id:1, name: "SG", qty: 3}
]
var result = list1.map(item=>{
qty = list2.filter(k=>k.name==item.name).length+1;
return qty>1 ? {...item, qty} : item;
});
console.log(result);
Vous pouvez créer une carte pour créer la liste de résultats, mais saisie par nom. Ensuite, parcourez la deuxième liste et mettez à jour les objets de la carte en conséquence. Enfin, extrayez les valeurs dans la liste de résultats.
L'utilisation de la carte évite d'utiliser find
ou filter
ou une autre boucle imbriquée, et fait exécuter l'algorithme en temps linéaire.
var list1 = [{id:1, name: "IN", qty: 1},{id:2, name: "TH"},{id:3, name: "AU"}] var list2 = [{id:3, name: "IN", qty:1},{id:5, name: "IN", qty:1},{id:4, name: "TH", qty: 2},{id:1, name: "SG", qty: 3}]; const map = new Map(list1.map(o => [o.name, {...o}])); for (let o of list2) { let p = map.get(o.name); if (p && o.qty) p.qty = (p.qty || 0) + o.qty; } const result = Array.from(map.values()); console.log(result);
TH
ne devrait-il pas être qté2
dans l'objet de sortie? ... Qu'arrive-t-il aux éléments manquants par nom dans la liste 2?@briosheje merci pour la réponse, j'ai mis à jour la sortie,
TH
devrait être inclus, danslist2
manquant par nom devrait également être inclus,Que se passe-t-il si dans
list2
l'entrée pourTH
n'a pas dequantité
? Qu'est-ce que cela signifie quand il n'y a pas de propriétéqty
? Est-ce équivalent avecqty: 0
?@trincot merci pour réponse, oui c'est équivalent à
qty: 0
juste une astuce, pensez à inclure votre question dans le corps de la question, pas seulement sur le titre. Cela rend vraiment plus clair ce que vous recherchez.
@jpnadas ok merci