Javascript 如何减少包含匹配键/值+变体的对象数组?

Javascript 如何减少包含匹配键/值+变体的对象数组?,javascript,arrays,Javascript,Arrays,减少此对象数组以获得所需结果的最佳方法是什么 const arr = [ { "id": "561", "count": "1", "month": 7 }, { "id": "561", "count": &q

减少此对象数组以获得所需结果的最佳方法是什么

const arr = [
  {
          "id": "561",
          "count": "1",
          "month": 7
      },
      {
          "id": "561",
          "count": "1",
          "month": 7
      },
      {
          "id": "561",
          "count": "-1",
          "month": 8
      },
      {
          "id": "561",
          "count": "1",
          "month": 9
      },
      {
          "id": "561",
          "count": "-1",
          "month": 9
      }
  ]
正如您所看到的,id匹配和某些月份匹配。我希望实现以下目标:

[
  {
    "id": "561",
    "count": 2
    "month": 7
  },
  {
    "id": "561",
    "count": -1,
    "month": 8
  },
  {
    "id": "561",
    "count": 0,
    "month": 9
  }
]
我基本上是试图按每个id的月份获得总计数。

您可以使用Array.prototype.reduce根据id和月份对阵列进行分组和评估

常数arr=[ { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:-1, 月份:8 }, { 身份证号码:561, 计数:1, 月份:9 }, { 身份证号码:561, 计数:-1, 月份:9 } ]; const res=Object.valuesarr.reduceac,item=>{ 如果acc[`${item.id}-${item.month}`]{ acc[`${item.id}-${item.month}`]={ …acc[`${item.id}-${item.month}`], 计数:`${parseIntacc[`${item.id}-${item.month}`].count+parseIntitem.count}` } }否则{ acc[`${item.id}-${item.month}`]=item; } 返回acc; }, {}; console.logres 您可以使用Array.prototype.reduce根据id和月份对阵列进行分组和评估

常数arr=[ { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:-1, 月份:8 }, { 身份证号码:561, 计数:1, 月份:9 }, { 身份证号码:561, 计数:-1, 月份:9 } ]; const res=Object.valuesarr.reduceac,item=>{ 如果acc[`${item.id}-${item.month}`]{ acc[`${item.id}-${item.month}`]={ …acc[`${item.id}-${item.month}`], 计数:`${parseIntacc[`${item.id}-${item.month}`].count+parseIntitem.count}` } }否则{ acc[`${item.id}-${item.month}`]=item; } 返回acc; }, {};
console.logres 下面是一个使用Array.prototype.reduce创建新数组和Array.prototype.find检查新数组中是否已存在当前值的示例

常数arr=[ { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:-1, 月份:8 }, { 身份证号码:561, 计数:1, 月份:9 }, { 身份证号码:561, 计数:-1, 月份:9 } ] const result=arr.reduceac,值=>{ const index=acc.findIndex{id,month}=>id==value.id&&month==value.month; 如果索引>-1{ acc[index]['count']+=Numbervalue.count; } 否则{ acc.push{…值,计数:Numbervalue.count}; } 返回acc; }, []
console.logresult下面是一个使用Array.prototype.reduce创建新数组和Array.prototype.find检查新数组中是否已存在当前值的示例

常数arr=[ { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:1, 月份:7 }, { 身份证号码:561, 计数:-1, 月份:8 }, { 身份证号码:561, 计数:1, 月份:9 }, { 身份证号码:561, 计数:-1, 月份:9 } ] const result=arr.reduceac,值=>{ const index=acc.findIndex{id,month}=>id==value.id&&month==value.month; 如果索引>-1{ acc[index]['count']+=Numbervalue.count; } 否则{ acc.push{…值,计数:Numbervalue.count}; } 返回acc; }, []
console.logresultid的561和第7个月应该有2个计数…@RobinMackenzie啊,我错过了问题中的那部分。现在谢谢你的作品,谢谢你的例子!id为561,第7个月应该有2个…@RobinMackenzie啊,我错过了问题中的那部分。现在谢谢你的作品,谢谢你的例子!您正在连接计数值而不是添加…@RobinMackenzie我在解决方案中更新了该部分,我没有看到计数值是一个字符串。这是有效的,谢谢您的示例!您正在连接计数值而不是添加…@RobinMackenzie我在解决方案中更新了该部分,我没有看到计数值是一个字符串。这是有效的,谢谢您的示例!