繁体   English   中英

求和值,并将具有相同 id 的对象值合并到一个新数组中

[英]sum values, and merge object values ​with the same id into a new array

我有一个从服务器收到的项目对象。 每个项目及其数量都必须与卖家一起保存,但是,在屏幕上显示时,我需要在新数组中独立于卖家的值进行总计。

[
    { code: 1, item: 'ball', salesman: 'Braan', quantity: 5, price: 10.00},
    { code: 1, item: 'shoe', salesman: 'Alex', quantity: 5, price: 20.00},
    { code: 1, item: 'ball', salesman: 'Max', quantity: 3, price: 10.00},
    { code: 1, item: 'shirt', salesman: 'Braan', quantity: 5, price: 15.00}
]

所需的输出是:

[
    { code: 1, item: 'ball', quantity: 8, price: 20.00},
    { code: 1, item: 'shoe', quantity: 5, price: 20.00},
    { code: 1, item: 'shirt', quantity: 5, price: 15.00}
]

基本上你可以重新映射你的对象来删除salesman键。

 const serverData = [{ code: 1, item: 'ball', salesman: 'Braan', quantity: 5, price: 10.00 }, { code: 1, item: 'shoe', salesman: 'Alex', quantity: 5, price: 20.00 }, { code: 1, item: 'ball', salesman: 'Max', quantity: 3, price: 10.00 }, { code: 1, item: 'shirt', salesman: 'Braan', quantity: 5, price: 15.00 } ] const result = serverData .map((item, i, array) => { const defaultValue = { code: item.code, item: item.item, quantity: 0, price: 0 } const finalValue = array .filter(other => other.item === item.item) //we filter the same items .reduce((accum, currentVal) => { //we reduce them into a single entry accum.quantity += currentVal.quantity; accum.price += currentVal.price; return accum; }, defaultValue); return finalValue; }) .filter((item, thisIndex, array) => { //now our new array has duplicates, lets remove them const index = array.findIndex((otherItem, otherIndex) => otherItem.item === item.item && otherIndex !== thisIndex && otherIndex > thisIndex); return index === -1 }) console.log(result)

简单地使用 map 函数创建具有减少属性的对象的新数组。

 const arr = [ { code: 1, item: 'ball', salesman: 'Braan', quantity: 5, price: 10.00}, { code: 1, item: 'shoe', salesman: 'Alex', quantity: 5, price: 20.00}, { code: 1, item: 'ball', salesman: 'Max', quantity: 3, price: 10.00}, { code: 1, item: 'shirt', salesman: 'Braan', quantity: 5, price: 15.00} ]; const newArr = arr.map((obj) => { return { code: obj.code, quantity: obj.quantity, price: obj.price, item: obj.item } }) console.log(newArr)

尝试这个

 og = [ { code: 1, item: 'ball', salesman: 'Braan', quantity: 5, price: 10.00}, { code: 1, item: 'shoe', salesman: 'Alex', quantity: 5, price: 20.00}, { code: 1, item: 'ball', salesman: 'Max', quantity: 3, price: 10.00}, { code: 1, item: 'shirt', salesman: 'Braan', quantity: 5, price: 15.00} ] var filtered = {}; og.forEach(d => { x = filtered[d.item] || {}; x = { code: d.code, item: d.item, quantity: (x.quantity || 0) + d.quantity, price: (x.price || 0) + d.price } filtered[d.item] = x; }) var fin = Object.keys(filtered).map(item => filtered[item]) console.log(fin)

虽然我建议创建所有项目类型的地图,因为这很容易访问。

您可以通过按item分组并假设相同的价格来减少数组。

 var data = [{ code: 1, item: 'ball', salesman: 'Braan', quantity: 5, price: 10.00 }, { code: 1, item: 'shoe', salesman: 'Alex', quantity: 5, price: 20.00 }, { code: 1, item: 'ball', salesman: 'Max', quantity: 3, price: 10.00 }, { code: 1, item: 'shirt', salesman: 'Braan', quantity: 5, price: 15.00 }], result = data.reduce((r, { code, item, quantity, price }) => { var temp = r.find(o => o.item === item); if (!temp) { r.push({ code, item, quantity, price }); } else { temp.quantity += quantity; } return r; }, []); console.log(result)

var result = [];
myArray.reduce(function(res, value) {
 if (!res[value.item]) {
res[value.item] = { price: 0,quantity: 0 };
result.push(res[value.item])
}
res[value.item].quantity += value.quantity;
res[value.item].price += value.price;

 return res;
 }, {});

控制台日志(结果)

谢谢大家,我是这样解决的:

mergeEqualsItems(items: any[]) {
        const itemsCopy = JSON.parse(JSON.stringify(items));
        const map = new Map();
        const newArr = [];
        itemsCopy.forEach(elem => {
          if (map.get(elem.id)) {
            const elemMap = map.get(elem.id);
            elemMap.quantity = elemMap.quantity + elem.quantity;
            map.set(elem.id, elemMap);
          } else {
            delete elem.salesman;
            map.set(elem.id, elem);
          }
        });
        map.forEach(elem => newArr.push(elem));
        return newArr;
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM