在jsonArray项目中重复的javascript计数值

时间:2017-06-29 15:34:31

标签: javascript arrays json

我需要计算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函数。我想要一个代码来计算每个值的重复次数。

3 个答案:

答案 0 :(得分:2)

您可以查看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'))

答案 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'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,Nina在这里有最好的答案。

修改

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