计算JSON内具有特定属性的元素数量

时间:2015-05-04 08:04:44

标签: javascript jquery arrays json

我有一些JSON数据:

{"humans": [
    { "firstName" : "Paul", "lastName" : "Taylor", "hairs": 2 },
    { "firstName" : "Sharon", "lastName" : "Mohan", "hairs": 3 },
    { "firstName" : "Mohan", "lastName" : "Harris", "hairs": 3 },
    { "firstName" : "Deborah", "lastName" : "Goldman", "hairs": 4 },
    { "firstName" : "Mark", "lastName" : "Young", "hairs": 4 },
    { "firstName" : "Tom", "lastName" : "Perez", "hairs": 4 }
    //and so on...
]}

我希望能够计算所有拥有2根头发,3根头发等的人。现在我正在使用jQuery.each()加上递增计数数组,它可以正常工作。 但我想知道是否有更简单的方法来做到这一点。

更新: 附加代码说明我现在在做什么:

var results = eval(data.humans);
var count_array = [0, 0, 0, 0, 0, 0, 0];
$(results).each(function() {
    if (this.hairs == 1) {
        count_array[0]++;
    }
    if (this.hairs == 2) {
        count_array[1]++
    }
    if (this.hairs == 3) {
        count_array[2]++
    }
    if (this.hairs == 4) {
        count_array[3]++
    }
    if (this.hairs == 5) {
        count_array[4]++
    }
    if (this.hairs == 6) {
        count_array[5]++
    }
    if (this.hairs == 7) {
        count_array[6]++
    }
});

5 个答案:

答案 0 :(得分:8)

您可以使用filter function过滤对象数组:

var data = {...}

data.humans.filter(function(o) { return o.hairs == 2 }).length
//Return the number of humans who have 2 hairs

看看fiddle

答案 1 :(得分:2)

javascript for循环最快:

var counter = 0;

for (var i = 0; i < data.humans.length; i++) {
   if (data.humans[i].hairs === 2) {
      counter++;
   }
}

答案 2 :(得分:2)

我的解决方案可能就是您想要的

var data = {
                "humans": [
                    { "firstName" : "Paul", "lastName" : "Taylor", "hairs": 2 },
                    { "firstName" : "Sharon", "lastName" : "Mohan", "hairs": 3 },
                    { "firstName" : "Mohan", "lastName" : "Harris", "hairs": 3 },
                    { "firstName" : "Deborah", "lastName" : "Goldman", "hairs": 4 },
                    { "firstName" : "Mark", "lastName" : "Young", "hairs": 4 },
                    { "firstName" : "Tom", "lastName" : "Perez", "hairs": 4 },
                    { "firstName" : "Joseph", "lastName" : "Goldman", "hairs": 5 },
                    { "firstName" : "Mary", "lastName" : "White", "hairs": 5 },
                    { "firstName" : "Matthew", "lastName" : "Garcia", "hairs": 5 },
                    { "firstName" : "Patricia", "lastName" : "Allen", "hairs": 5 },
                    { "firstName" : "Larry", "lastName" : "Robinson", "hairs": 6 },
                    { "firstName" : "Manb", "lastName" : "Lopez", "hairs": 6 },
                    { "firstName" : "Jose", "lastName" : "Martinez", "hairs": 6 },
                    { "firstName" : "Deborah", "lastName" : "Walker", "hairs": 6 },
                    { "firstName" : "Joseph", "lastName" : "Lopez", "hairs": 6 },
                    { "firstName" : "Tinman", "lastName" : "Moore", "hairs": 7 },
                    { "firstName" : "Jose", "lastName" : "Jackson", "hairs": 7 },
                    { "firstName" : "Karen", "lastName" : "Goldman", "hairs": 7 },
                    { "firstName" : "Paul", "lastName" : "Taylor", "hairs": 7 },
                    { "firstName" : "Amy", "lastName" : "Gonzalez", "hairs": 7 },
                    { "firstName" : "Richard", "lastName" : "Martinez", "hairs": 7 }
                ]
            };
var counterList = [];
$.each(data.humans,function(i,item){
    counterList.push(item.hairs);
});

$.extend({
    distinct : function(anArray) {
       var result = [];
       $.each(anArray, function(i,v){
           if ($.inArray(v, result) == -1) result.push(v);
       });
       return result;
    }
});

var uniqueCounterList= $.distinct(counterList);
var html = "";
$.each(uniqueCounterList,function(j,itemUnique){
    html += "<div>Hair "+itemUnique+": "+(data.humans.filter(function(o) { return o.hairs == itemUnique }).length)+"</div>";
});
$("#count").html(html);

http://jsfiddle.net/8g5ggfeh/

答案 3 :(得分:1)

这是一个抽象分组函数并获取列表样式结果的示例:

var data = {
            "humans": [
                { "firstName" : "Paul", "lastName" : "Taylor", "hairs": 2 },
                { "firstName" : "Sharon", "lastName" : "Mohan", "hairs": 3 },
                { "firstName" : "Mohan", "lastName" : "Harris", "hairs": 3 },
                { "firstName" : "Deborah", "lastName" : "Goldman", "hairs": 4 },
                { "firstName" : "Mark", "lastName" : "Young", "hairs": 4 },
                { "firstName" : "Tom", "lastName" : "Perez", "hairs": 4 },
                { "firstName" : "Joseph", "lastName" : "Goldman", "hairs": 5 },
                { "firstName" : "Mary", "lastName" : "White", "hairs": 5 },
                { "firstName" : "Matthew", "lastName" : "Garcia", "hairs": 5 },
                { "firstName" : "Patricia", "lastName" : "Allen", "hairs": 5 },
                { "firstName" : "Larry", "lastName" : "Robinson", "hairs": 6 },
                { "firstName" : "Manb", "lastName" : "Lopez", "hairs": 6 },
                { "firstName" : "Jose", "lastName" : "Martinez", "hairs": 6 },
                { "firstName" : "Deborah", "lastName" : "Walker", "hairs": 6 },
                { "firstName" : "Joseph", "lastName" : "Lopez", "hairs": 6 },
                { "firstName" : "Tinman", "lastName" : "Moore", "hairs": 7 },
                { "firstName" : "Jose", "lastName" : "Jackson", "hairs": 7 },
                { "firstName" : "Karen", "lastName" : "Goldman", "hairs": 7 },
                { "firstName" : "Paul", "lastName" : "Taylor", "hairs": 7 },
                { "firstName" : "Amy", "lastName" : "Gonzalez", "hairs": 7 },
                { "firstName" : "Richard", "lastName" : "Martinez", "hairs": 7 }
            ]
        };

function groupByHair(array, groupOf) {
 var groups = {};
  array.forEach(function(element) {
  var groupName = groupOf(element);
   if (groupName in groups)
     groups[groupName].push(element);
   else
     groups[groupName] = [element];
  });
  return groups;
}

var byHairs = groupByHair(data.humans , function(h) {
  return h.hairs;
 });

for (var hairs in byHairs) {
 var hairsN = byHairs[hairs].length;
 console.log('in '+ hairs +'hairs-group you have: ' +hairsN+' people');
}

<强> fiddle

答案 4 :(得分:0)

你能试试吗?它会对您的数据进行分组,您将获得相同的数据。

var groupedData = _.groupBy(YourJsonName, function(d){return d.hairs});