【问题标题】:Count number of elements with certain properties inside JSON计算 JSON 中具有某些属性的元素的数量
【发布时间】:2015-07-13 13:24:31
【问题描述】:

我有一些 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 等
  • 发布你的实际代码来检查你做了什么
  • @ArunPJohny:javascript 中的 grep?我不知道。能详细点吗?
  • @Mohit 它在 jQuery 中与来自 es5 的过滤器相同

标签: javascript jquery arrays json


【解决方案1】:

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

var data = {...}

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

看看fiddle

【讨论】:

    【解决方案2】:

    javascript for 循环最快:

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

    【讨论】:

      【解决方案3】:

      我的解决方案可能是你想要的

      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/

      【讨论】:

        【解决方案4】:

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

        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

        【讨论】:

          【解决方案5】:

          你可以试试这个吗?它将对您的数据进行分组,您将获得相同的计数。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-17
            相关资源
            最近更新 更多