我需要计算javascript中jsonArray项中值的出现次数。
将此视为我的jsonArray
:
{"name":"jack","age":23},
{"name":"john","age":20},
{"name":"alison","age":23},
{"name":"steve","age":25},
.
.
.
现在例如我需要知道每个年龄在这个数组中重复多少次,我想计算每个属性的每个值,我的意思是我需要这样的结果:
name : {"jack" : 2,"james" : 10,"john" : 1,....}
age : {"23":10,"20":15,"25":2,....}
实现这一目标的最简单方法是什么?
编辑: 我的数组非常大,我不想为每个值调用count函数。我想要一个代码来计算每个值的重复次数。
答案 0 :(得分:2)
function mapToProp(data, prop) {
return data
.reduce((res, item) => Object
.assign(res, {
[item[prop]]: 1 + (res[item[prop]] || 0)
}), Object.create(null))
;
}
const data = [
{"name": "jack", "age": 23},
{"name": "john", "age": 20},
{"name": "alison", "age": 23},
{"name": "steve", "age": 25}
];
console.log('mapAndCountByAge', mapToProp(data, 'age'))
答案 1 :(得分:0)
您可以使用一个对象,其中键和值用作计数的属性。
var array = [{ name: "jack", age:23 }, { 'name': "john", age: 20 }, { name: "alison", age: 23 }, { name: "steve", age: 25 }],
result = {};
array.forEach(function (o) {
Object.keys(o).forEach(function (k) {
result[k] = result[k] || {};
result[k][o[k]] = (result[k][o[k]] || 0) + 1;
});
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
不像Nina's和Hitmands'那样优雅,但对于初学者来说这更容易理解(如果有任何初学者正在阅读此内容)。
var jsonArray = [
{"name": "John", "age": 20},
{"name": "John", "age": 21},
{"name": "Doe", "age": 21},
{"name": "Doe", "age": 23},
{"name": "Doe", "age": 20},
];
var names = [],
ages = [];
// separate name data and age data into respective array
// only need to access the original data once
jsonArray.forEach(function(val){
names.push(val['name']);
ages.push(val['age']);
});
function aggregate(array){
var obj = {};
array.forEach(function(val){
if (!obj[val])
// create new property if property is not found
obj[val] = 1;
else
// increment matched property by 1
obj[val]++;
});
return JSON.stringify(obj);
}
console.log("Names: " + aggregate(names));
console.log("Ages: " + aggregate(ages));

In my opinion,Nina在这里有最好的答案。
修改强>
事实上,当提供大型数据集时(正如OP所说"阵列非常大"),这种方法比Nina的答案快约45%,比同样快约81%根据{{3}},Hitmand的回答。我不知道为什么。