3 个回答
Object.values(arr.reduce((obj, item) => {
  const {名称, 排序, 单位, 数量, 单价, 金额} = item;
  const key = 名称+单位+排序+单价;
  if (obj[key]) {
    obj[key]['数量'] = (Number(obj[key]['数量']) + Number(数量)).toFixed(2);
    obj[key]['金额'] = (Number(obj[key]['金额']) + Number(金额)).toFixed(2);
  } else {
    obj[key] = item;
  }
  return obj;
}, {}));
function merge(arr) {
    var ret = [];
    var sourceKeys = ["名称", "排序", "单位", "单价"];
    var targetKeys = ["数量", "金额"];
    loop: for (var i = 0, key, obj; i < arr.length; ++i) {
        find: for (var j = 0, value; j < ret.length; ++j) {
            for (var k = 0; k < sourceKeys.length; ++k) {
                key = sourceKeys[k], value = arr[i][key];
                if (ret[j][key] !== value) continue find;
            }
            for (var k = 0; k < targetKeys.length; ++k) {
                key = targetKeys[k], value = arr[i][key];
                if (typeof value === "string") {
                    ret[j][key] = (+ret[j][key] + +value).toFixed(2);
                } else {
                    ret[j][key] += value;
                }
            }
            continue loop;
        }
        ret[ret.length] = obj = {};
        for (key in arr[i]) obj[key] = arr[i][key];
    }
    return ret;
}
console.dir(merge(arr));
function sumArray(someKeys, sumKeys, arr) {
  return arr.reduce((res, cur) => {
    const _index = res.findIndex(i => someKeys.reduce((condition, k) => condition && cur[k] === i[k], true));
    if(_index > -1) {
      sumKeys.forEach(i => {
        res[_index][i] += cur[i];
      })
    } else {
      res.push(Object.assign({}, cur));
    }
    return res;
  }, [])
}

// 使用 
const arr = [
    {
        "名称": "商品三",
        "数量": 2,
        "单价": 12,
        "单位": "吨",
        "金额": 24
    },
    {
        "名称": "商品一",
        "数量": 14,
        "单价": 8,
        "单位": "吨",
        "金额": 112
    },
    {
        "名称": "商品三",
        "数量": 10,
        "单价": 12,
        "单位": "吨",
        "金额": 120
    },
    {
        "名称": "商品一",
        "数量": 0,
        "单价": 8,
        "单位": "吨",
        "金额": 0
    },
    {
        "名称": "商品三",
        "数量": 6,
        "单价": 12,
        "单位": "吨",
        "金额": 72
    },
    {
        "名称": "商品二",
        "数量": 18,
        "单价": 10,
        "单位": "吨",
        "金额": 180
    },
    {
        "名称": "商品一",
        "数量": 11,
        "单价": 8,
        "单位": "吨",
        "金额": 88
    },
    {
        "名称": "商品二",
        "数量": 0,
        "单价": 10,
        "单位": "吨",
        "金额": 0
    },
    {
        "名称": "商品二",
        "数量": 13,
        "单价": 10,
        "单位": "吨",
        "金额": 130
    },
    {
        "名称": "商品三",
        "数量": 15,
        "单价": 12,
        "单位": "吨",
        "金额": 180
    }
]
sumArray(['名称', '单位', '单价'], ['数量', '金额'], arr);
// 结果
/**
[
    {
        "名称": "商品三",
        "数量": 33,
        "单价": 12,
        "单位": "吨",
        "金额": 396
    },
    {
        "名称": "商品一",
        "数量": 25,
        "单价": 8,
        "单位": "吨",
        "金额": 200
    },
    {
        "名称": "商品二",
        "数量": 31,
        "单价": 10,
        "单位": "吨",
        "金额": 310
    }
]
**/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题