统计JSON中每个项目的出现次数

4
我希望返回每个属性的计数。例如,我想返回每个组中有多少人。因此,对于以下JSON,它将返回组1中有3个人,组3中有3个人,组16中有2个人等等。
我正在寻找JavaScript或jQuery解决方案。
注意:我不需要帮助解析JSON。我只需要帮助找到每个出现次数的计数。
{
"people":[
    {"id":"0","name":"Mike Johnson","group":1},
    {"id":"1","name":"Bob Smith","group":2},
    {"id":"2","name":"Richard Thomas","group":3},
    {"id":"3","name":"Betty White","group":16},
    {"id":"4","name":"Tim Thompson","group":3},
    {"id":"5","name":"Carl Lewis","group":16},
    {"id":"6","name":"Kathy Towers","group":3},
    {"id":"7","name":"Billy Bob","group":1},
    {"id":"8","name":"Sally Bailey","group":1}
    ]
}

1
以某种形式,你需要使用for循环遍历它,并递增在循环外定义的计数变量。 - Kevin B
你尝试过什么?你知道如何将你的JSON字符串解析成JavaScript对象吗? - Álvaro González
@talnicolas 我已经尝试了所有不起作用的方法 ;) - relyt
@ÁlvaroG.Vicario 是的,我知道如何解析它。我只是在循环遍历它并返回计数时遇到了问题。 - relyt
@ÁlvaroG.Vicario。好的,但是问题中只要求确定计数,而不是解析JSON。 - relyt
@ÁlvaroG.Vicario 已收到。谢谢! - relyt
2个回答

5

就像某个评论所说的那样,您必须循环遍历“people”数组。很容易将此“功能”转换为函数,就像我所做的那样,这样您只需指定要搜索的组,即可获得人数。

http://jsfiddle.net/UdhRW/

var obj = {
  "people": [
    {"id":"0","name":"Mike Johnson","group":1},
    {"id":"1","name":"Bob Smith","group":2},
    {"id":"2","name":"Richard Thomas","group":3},
    {"id":"3","name":"Betty White","group":16},
    {"id":"4","name":"Tim Thompson","group":3},
    {"id":"5","name":"Carl Lewis","group":16},
    {"id":"6","name":"Kathy Towers","group":3},
    {"id":"7","name":"Billy Bob","group":1},
    {"id":"8","name":"Sally Bailey","group":1}
    ]
};

function getCount(group) {
    var count = 0;
    for (var i = 0; i < obj.people.length; i++) {
        if (obj.people[i].group == group) {
            count++;
        }
    }
    return count;
}

getCount(1);   // should return 3

如果 obj 不是全局变量,你可以将它传递给函数,方法如下:
function getCount(arr, group) {
    var count = 0;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].group == group) {
            count++;
        }
    }
    return count;
}

getCount(obj.people, 1);   // should return 3

2
这让我走上了正确的轨道。谢谢。 - relyt
感谢直接并有帮助的回答。如果有一个大型数据集,你还会使用 For 循环吗?例如在 XML 文件中使用 XPath,一旦加载数据,就可以快速找到节点或数据树的部分。当然,XML 在大型数据集上的处理速度较慢。只是想知道对于大型 JSON 文件,什么是最好的选择? - windsurf88

1
您可以使用类似以下代码来提取组:

> var groups = foo['people'].map(function(value, index) {return value['group']});
[1, 2, 3, 16, 3, 16, 3, 1, 1]

从那里开始,只需使用这些键创建一个对象:

var group_count = {};

groups.forEach(function(value, index) {
    if (value in group_count) {
        group_count[value] += 1;
    } else {
        group_count[value] = 1;
    }
});

这将给你一个包含每个组出现次数的对象。

此外,这段代码不支持IE8及以下版本,因此您需要在网络上找到一个“forEach”和“map”的polyfill。


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