无法根据字符串值减少对象数组
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.count
、acc
是一个对象。当你连接一个对象和一个数字时,你会得到一个字符串(除非你有一个返回数字的对象的 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