如何计算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方法计算此数组中嵌套对象值的总和?

JavaScript Array对象

如何从 json 对象构建键值的 JavaScript 数组

如何使用javascript在对象数组中执行计算