1
votes

Comment additionner la valeur dans l'objet de tableau existant en fonction de la condition en javascript

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


6 commentaires

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, dans list2 manquant par nom devrait également être inclus,


Que se passe-t-il si dans list2 l'entrée pour TH n'a pas de quantité ? Qu'est-ce que cela signifie quand il n'y a pas de propriété qty ? Est-ce équivalent avec qty: 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


3 Réponses :


0
votes

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.


0 commentaires

0
votes

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


0 commentaires

1
votes

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


0 commentaires