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

8

我有一些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]++
    }
});

我认为并没有...虽然你可能会找到不同版本的循环,比如grep等。 - Arun P Johny
请将以下与编程相��的内容从英语翻译成中文。仅返回翻译后的文本:请发布您实际完成的代码以进行检查。 - Jordi Castilla
@ArunPJohny:JavaScript 中的 grep?我不知道。你能详细说明一下吗? - Mohit
1
@Mohit,jQuery 中有与 es5 中的 filter 相同的功能。 - Arun P Johny
5个回答

16
你可以使用filter函数来过滤一个对象数组:
var data = {...}

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

请查看fiddle


3

JavaScript for循环是最快的:

var counter = 0;

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

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/

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”,但同时也给出了一个可能的翻译)

0

你可以试试这个吗?它会对你的数据进行分组,并为相同的数据计数。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接