如何计算Javascript中对象数组中不同值的出现次数?
Posted
技术标签:
【中文标题】如何计算Javascript中对象数组中不同值的出现次数?【英文标题】:How to count number of occurrences of distinct values from an array of objects in Javascript? 【发布时间】:2017-09-26 04:34:11 【问题描述】:我有一个对象数组,如下所示:
var array =
[
"name":"abc","age":20
"name":"abc","age":20
"name":"abc","age":20
"name":"xyz","age":21
"name":"xyz","age":21
]
我想计算不同值的出现次数,例如:
[3,2]
假设 abc
出现 3 次,xyz
出现 2 次。
我在reactjs
做这件事。我可以使用 this answer 获得不同的值,例如 [abc,xyz]
。
首选ES6语法。
【问题讨论】:
【参考方案1】:快速回答:new Set(array).size
。
解释(来自 MDN 网络文档):
Set 对象允许您存储任何类型的唯一值,无论是 原始值或对象引用
【讨论】:
这只会返回数组的长度。这不是提问者想要的。 @trincot 不。它将返回包含独特元素的 Set 的基数。 我认为您误解了这个问题:Set 的大小将与 Array 的长度相同,因为 OP 数组中的所有对象都是不同的。如果某些对象在该数组中被多次引用,您只会得到不同,但对于 OP 呈现的内容并非如此:他们的问题不是寻找唯一的对象引用,而是寻找具有唯一属性值的对象(即name
) 在那些 distinct 对象中。【参考方案2】:
您可以使用forEach/map
来迭代数组并将计数存储在另一个变量中,请检查:
var array = [
"name" : "abc", "age" : 20,
"name" : "abc", "age" : 20,
"name" : "abc", "age" : 20,
"name" : "xyz", "age" : 21,
"name" : "xyz", "age" : 21,
];
let b = ;
array.forEach(el =>
b[el.name] = (b[el.name] || 0) + 1;
)
console.log(b);
【讨论】:
【参考方案3】:您需要知道计数属于哪个名称,因此我建议不要输出一个不提供任何线索的数组,而是输出一个以名称为键并以相应计数作为值的对象:
var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), );
var array =
[
"name":"abc","age":20,
"name":"abc","age":20,
"name":"abc","age":20,
"name":"xyz","age":21,
"name":"xyz","age":21
];
var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), );
console.log(result);
【讨论】:
【参考方案4】:地图/减少救援:
const frequency = array
.map(( name ) => name)
.reduce((names, name) =>
const count = names[name] || 0;
names[name] = count + 1;
return names;
, );
// frequency: abc: 3, xyz: 2
【讨论】:
【参考方案5】:如果有人在寻找存储在数组中的不同计数
var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), );
result = Object.values(result); // returns an array of values from the object
// result will be [3,2]
【讨论】:
【参考方案6】:这是一种方法:
var array =
[
"name":"abc","age":20,
"name":"abc","age":20,
"name":"abc","age":20,
"name":"xyz","age":21,
"name":"xyz","age":21
]
let yy =
array.map( el =>
yy[el.name] = (yy[el.name] || 0) + 1
)
console.log(yy)
这是另一种方式:
var array =
[
"name":"abc","age":20,
"name":"abc","age":20,
"name":"abc","age":20,
"name":"xyz","age":21,
"name":"xyz","age":21
]
let yy =
array.map( el =>
if (yy[el.name] === undefined || yy[el.name] === 0)
yy[el.name] = 1
else
yy[el.name] = yy[el.name] + 1
)
console.log(yy)
【讨论】:
以上是关于如何计算Javascript中对象数组中不同值的出现次数?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 计算相同的值并划分数组中相同值的结果
javascript中,知道一个值,如何删除数组中的这个值的元素。
你会如何解决这个问题?使用reduce方法计算此数组中嵌套对象值的总和?