无法根据字符串值减少对象数组

Posted

技术标签:

【中文标题】无法根据字符串值减少对象数组【英文标题】:Unable to reduce an array of objects based on string value 【发布时间】:2021-10-25 20:58:30 【问题描述】:

所以我有这个对象数组,我需要根据每个对象的 prop 值来减少它们并计算总数。

我的意思是,假设我有这个对象数组:

[
      dateTime: '2021-07-30', count: 4 ,
      dateTime: '2021-07-31', count: 1 ,
      dateTime: '2021-08-01', count: 2 ,
      dateTime: '2021-08-02', count: 1 ,
      dateTime: '2021-08-03', count: 2 ,
      dateTime: '2021-08-04', count: 3 
]

我想把它简化成这样:

[
      month: '2021-07', count: 5 ,
      month: '2021-08', count: 8 
]

这是sn-p:

const data = [
    dateTime: '2021-07-30',
    count: 4
  ,
  
    dateTime: '2021-07-31',
    count: 1
  ,
  
    dateTime: '2021-08-01',
    count: 2
  ,
  
    dateTime: '2021-08-02',
    count: 1
  ,
  
    dateTime: '2021-08-03',
    count: 2
  ,
  
    dateTime: '2021-08-04',
    count: 3
  
];

const stackedMonths = data.reduce((acc, curr) => 

  return [
    month: curr.dateTime.slice(0, 7),
    count: acc + curr.count
  ];

, []);

console.log(stackedMonths);

在尝试了代码之后,我得到了这个没有任何意义的:

[  month: '2021-08', count: '[object Object]2'  ]

我在这里做错了什么?请注意,我是减少的新手,我仍在学习它。

【问题讨论】:

在这一行,count: acc + curr.countacc 是一个对象。当你连接一个对象和一个数字时,你会得到一个字符串(除非你有一个返回数字的对象的 toValue 方法。)你肯定不打算把一个对象和一个数字连接起来吗? 不,我没有。我正在从 SO 中的各种答案中自己尝试一下。但是 acc 不是数组吗? 一个数组就是一个对象。您不能将数字添加到对象本身,因为对象不是数字(或任何形式的数字)。 @esqew 明白了。谢谢 它应该是一个数组,但如果是,你不会得到[object Object]2。是的,数组是对象,但是数组以这种方式连接时会产生不同的结果 【参考方案1】:

您可以使用 Array#reduce 和一个对象来存储每个月的总和。

const arr = [
      dateTime: '2021-07-30', count: 4 ,
      dateTime: '2021-07-31', count: 1 ,
      dateTime: '2021-08-01', count: 2 ,
      dateTime: '2021-08-02', count: 1 ,
      dateTime: '2021-08-03', count: 2 ,
      dateTime: '2021-08-04', count: 3 
];
const res = Object.values(arr.reduce((acc, curr)=>
  const month = curr.dateTime.slice(0, -3);
  (acc[month] ??= month, count: 0).count += curr.count;
  return acc;
, ));
console.log(res);

如果month 的值还没有作为累加器上的键存在,则将其设置为month: month, count: 0。然后,count 会增加当前对象的计数。

【讨论】:

嗨。你能解释一下这部分(acc[month] ??= month, count: 0).count += curr.count;吗? @s.khan 如果month 的值还没有作为累加器上的键存在,则将其设置为month: month, count: 0。然后,计数会增加当前对象的计数。 Object.values??= 的使用非常巧妙,喜欢简洁。 @Unmitigated 嘿伙计,由于??= 运算符,我在 NodeJS 中遇到错误。 @s.khan 您可以将其替换为acc[month] = acc[month] || month, count: 0

以上是关于无法根据字符串值减少对象数组的主要内容,如果未能解决你的问题,请参考以下文章

我将如何减少这个数组,以便每个对象中的对象被合并 javascript 但不知道键值名称

Laravel - 根据键值删除数组内的对象 - array_filter

如何减少字符串价格的对象数组

js处理一个数组中包含多个对象,根据对象的一个属性查找到这个对象

【JS】数组对象自定义排序

根据以数组形式存在于对象值内的值搜索对象数组