2017-06-29 50 views
0

我需要计算javascript中jsonArray项中值的出现次数。 认为这是我的jsonArray在jsonArray项中重复的javascript计数值

{"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

[计数对象值的出现次数](https://stackoverflow.com/questions/29957390/counting-occurrences-of-object-values) – mhodges

回答

1

你可以看看Array.prototype.reduce

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'))

+0

“我想计算每个属性的每个值” – mhodges

+0

this是非常好的,但是如果不知道值的话,那么大阵列呢? 是否可以在不知道它的情况下对每个值进行计数?只需计算属性中每个值的出现次数 – m7majidi

+0

@ m7majidi是的,那确切的问题是为什么我将其标记为重复项。查看我在评论中链接的问题。这个问题已被多次询问,并且是一个简单的谷歌搜索问题。 – mhodges

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; }

0

不优雅的Nina'sHitmands'答案,但是这是比较容易理解,适合初学者(如果任何初学者阅读本)。

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,龚如心在这里有最好的答案。

编辑

事实上,当有大的数据集(如OP指出,“阵非常大”)提出,这种方法比尼娜的回答比Hitmand的快了约45%,约81%的速度根据jsben.ch回答。我不知道为什么。