繁体   English   中英

按对象键减少对象数组并对值求和

[英]Reduce the array of object by object key and sum the values

我有一个像这样的对象数组

const myArr = [
  {
    gender: 'female', items: 25, price: 250
  },
  {
    gender: 'male', items: 28, price: 112
  },
  {
    gender: 'unknown', items: 22, price: 82
  },
  {
    gender: 'Unknown', items: 23, price: 7
  },
  {
    gender: '', items: 27, price: 200
  }
];

如果性别值为“未知”、“未知”或空字符串,我想按性别对对象进行分组,并将其他值相加,结果将如下所示:

const myArr = [
  {
    gender: 'female', items: 25, price: 250
  },
  {
    gender: 'male', items: 28, price: 112
  },
  {
    gender: 'unknown', items: 72, price: 289
  },
];

我尝试过的是检查性别是“未知”、“未知”还是空字符串,如果为真,则将它们分组为“未知”,但我不确定如何求和项目和价格的值. 这是我尝试过的代码:

const myNewArr = Object.values(
  myArr.reduce(function (r, { gender, items, price }) {
     if (gender === 'unknown' || gender === 'Unknown' || gender === '') {
       gender = 'unknown';
       r[items] = r[items] + items;
       r[price] = r[price] + price; // here i need to sum items and price somehow
     }
     r[gender] = r[gender] || { gender, items, price};
     r[gender].items = r[items];
     r[gender].price = r[price];
     return r;
  }, Object.create(null))
);

我究竟做错了什么? 任何例子将不胜感激!

您需要将性别标准化为小写或使用unknown

然后您需要将值添加到每个相关属性。

 const array = [{ gender: 'female', items: 25, price: 250 }, { gender: 'male', items: 28, price: 112 }, { gender: 'unknown', items: 22, price: 82 }, { gender: 'Unknown', items: 23, price: 7 }, { gender: '', items: 27, price: 200 }], result = Object.values(array.reduce(function (r, { gender, items, price }) { gender = gender.toLowerCase() || 'unknown'; if (r[gender]) { r[gender].items += items; r[gender].price += price; } else { r[gender] = { gender, items, price }; } return r; }, Object.create(null))); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您需要检查累加器上是否已经存在这些值,并根据它们是否存在返回不同的结果。 我正在使用扩展语法在每次迭代中创建一个新对象。

此外,您应该避免像您在此处所做的那样重新分配参数:

gender = 'unknown';

下面是代码的工作版本

 const myArr = [ { gender: "female", items: 25, price: 250, }, { gender: "male", items: 28, price: 112, }, { gender: "unknown", items: 22, price: 82, }, { gender: "Unknown", items: 23, price: 7, }, { gender: "", items: 27, price: 200, }, ] const myNewArr = myArr.reduce((accumulator, { gender, items, price }) => { if (gender.toLowerCase() === "unknown" || !gender) { if (!accumulator.hasOwnProperty("unknown")) { return { ...accumulator, unknown: { items, price } } } else { return { ...accumulator, unknown: { ...accumulator.unknown, price: price + accumulator.unknown.price, items: items + accumulator.unknown.items, }, } } } else { if (!accumulator.hasOwnProperty(gender)) { return { ...accumulator, [gender]: { price, items } } } return { ...accumulator, [gender]: { price: price + accumulator[gender].price, items: items + accumulator[gender].items, }, } } }, {}) console.log(myNewArr)

暂无
暂无

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

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