NodeJS中如何统计JSON对象value属性的元素出现次数?
统计JSON对象中value属性的元素出现次数
给定如下JSON对象:
{"value": ["aaa", "bbb", "ccc", "aaa"], "answer": ["lorem", "lorem", "lorem", "lorem"], "question": ["lorem", "lorem", "lorem", "lorem"]}
需要统计其中value数组内元素的出现次数,期望得到结果:
{"aaa": 2,"bbb": 1,"ccc": 1}
你之前用reduce()的写法存在几个问题:
- 遍历的是整个JSON对象
query,但实际应该遍历query.value这个数组 - 错误访问了
name.value,遍历数组时name就是数组里的元素(比如"aaa"),并非带value属性的对象 - 展开时误用
...allNames.value,但累计对象allNames并没有value属性
正确的reduce()实现
const query = {"value": ["aaa", "bbb", "ccc", "aaa"], "answer": ["lorem", "lorem", "lorem", "lorem"], "question": ["lorem", "lorem", "lorem", "lorem"]}; const countedNames = query.value.reduce((allNames, name) => { const currCount = allNames[name] ?? 0; return { ...allNames, [name]: currCount + 1 }; }, {} as Record<string, number>); console.log(countedNames); // 输出:{"aaa":2,"bbb":1,"ccc":1}
更高效的写法(减少对象展开开销)
如果数组元素数量较多,每次展开对象会产生额外性能损耗,可以直接修改累计对象:
const countedNames = query.value.reduce((allNames, name) => { allNames[name] = (allNames[name] ?? 0) + 1; return allNames; }, {} as Record<string, number>);
内容的提问来源于stack exchange,提问作者Yasamura
相关产品推荐
相关产品推荐

