簡體   English   中英

如何根據 javascript 中的條件對現有數組 object 中的值求和

[英]How to sum value in the existing array object based on condition in javascript

我有兩個數組列表list1list2 ,屬性name匹配,然后將 list1 和 list2 的所有qty相加匹配 object,返回 list1 的更新數量

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

預期 Output:

 [
  {id:1, name: "IN",qty: 3},
  {id:2, name: "TH", qty: 2},
  {id:3, name: "AU"}
]

您可以創建 Map 來創建結果列表,但按名稱鍵入。 然后迭代第二個列表並相應地更新 map 中的對象。 最后將值提取到結果列表中。

使用 Map 可以避免使用findfilter或其他一些嵌套循環,並使算法在線性時間內運行。

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

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

這似乎可以解決問題。 第一個forEach循環將所有數量相加。 第二個循環構造結果,僅查找list1中的條目。 請注意,這僅在list1中沒有重復項時才按預期工作。

您還可以使用map function,邏輯是從第二個列表中過濾項目並獲取長度並添加一個作為當前元素,然后如果qty大於一個則相應地記錄。 這是工作示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM