【问题标题】:How to remove duplicates in array object and apply sum to particular key in javascript如何删除数组对象中的重复项并将总和应用于javascript中的特定键
【发布时间】:2020-10-18 17:35:44
【问题描述】:

我有一个对象obj,其中如何删除info 中的重复项并将数量之和qty 应用于javascript 中的键total。 如何删除数组对象中的重复项并将 sum 应用于 javascript 中的特定键。

function newList (obj){
 return obj.map(i=>({
          ...i,
          total: i.info.map(e => e.qty).reduce((prev, curr) => prev + curr, 0)
 }));
}

var obj =[
 {id:1, info:[{idx:1, qty: 1}, {idx:2, qty: 2},{idx:2, qty: 2}], code: "sample1", total: 1},
 {id:2, info:[{idx:3, qty: 2}, {idx:4, qty: 2}], code: "sample2", total: 2}
]

预期输出:

[
 {id:1, info:[{idx:1, qty: 1}, {idx:2, qty: 2}], code: "sample1", total: 3},
 {id:2, info:[{idx:3, qty: 2}, {idx:4, qty: 2}], code: "sample2", total: 4}
]

【问题讨论】:

标签: javascript arrays object nested-object


【解决方案1】:
function newList(obj) {
    return obj.map(i => ({
        ...i,
        ...reduceInfo(i.info)
    }));

}

function reduceInfo(array) {
    return array.reduce((a, c) => {
        a.info = a.info || [];
        a.total = a.total || 0;
        if (!a.info.some(element => c.idx === element.idx && c.qty === element.qty)) {
            a.info.push(c);
            a.total = a.total + c.qty;
        }
        return a;

    }, {});
}

var obj = [
    { id: 1, info: [{ idx: 1, qty: 1 }, { idx: 2, qty: 2 }, { idx: 2, qty: 2 }], code: "sample1", total: 1 },
    { id: 2, info: [{ idx: 3, qty: 2 }, { idx: 4, qty: 2 }], code: "sample2", total: 2 }
]

console.log(JSON.stringify(newList(obj)));

【讨论】:

    【解决方案2】:

    请尝试以下示例,尽管我的结果与显示为预期结果的总数不同。请尝试一下

    const obj = [
      {
        id: 1,
        info: [
          { idx: 1, qty: 1 },
          { idx: 2, qty: 2 },
          { idx: 2, qty: 2 },
        ],
        code: "sample1",
        total: 1,
      },
      {
        id: 2,
        info: [
          { idx: 3, qty: 2 },
          { idx: 4, qty: 2 },
        ],
        code: "sample2",
        total: 2,
      },
    ];
    
    let output = obj.map((entry) => {
      return {
        ...entry,
        info: entry.info.reduce((prev, curr) => {
          const item = prev.find(
            (element) => element.idx === curr.idx && element.qty == curr.qty
          );
    
          if (!item) {
            prev = [...prev, curr];
          }
    
          return prev;
        }, []),
      };
    });
    
    output = output.map((entry) => {
      return {
        ...entry,
        total: entry.total + entry.info.reduce((prev, curr) => prev + curr.qty, 0),
      };
    });
    
    console.dir(output, { depth: null, color: true });

    见

    【讨论】:

      【解决方案3】:

      您可以使用reduce 和Map(唯一的行):

      var obj =[
       {id:1, info:[{idx:1, qty: 1}, {idx:2, qty: 2},{idx:2, qty: 2}], code: "sample1", total: 1},
       {id:2, info:[{idx:3, qty: 2}, {idx:4, qty: 2}], code: "sample2", total: 2}
      ];
      
      var result = obj.reduce((acc, elem)=>{
          elem.info = [...new Map(elem.info.map(i=>[i.idx, i])).values()];
          elem.total = elem.info.reduce((sum, {qty})=>sum+qty,0);
          acc = [...acc, elem];
          return acc;
      },[]);
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2019-06-12
        • 2016-07-02
        • 2021-08-17
        • 1970-01-01
        • 2023-03-18
        • 2021-05-09
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        相关资源
        最近更新 更多