计算某些分组值jQuery数组的有效方法

时间:2014-06-13 15:03:29

标签: jquery arrays loops grouping

我有一群人。我想得到按每个级别和性别组合分组的整个列表的计数。我想将这些结果存储在我可以按任何顺序显示的单独变量中。

例如,获取B级男性的计数并将其存储在变量中,B级女性并将其存储在变量中,B级非二元,A级男性,A级女性和A级非二元,等等通过其他级别存储它们自己的变量。如果将它们存储在数组中是更好的(可能是),存储的顺序应该是A级男性,女性,二进制,直到Z男性,女性,二进制。

另外,我也希望每个级别的总数。

我在jsfiddle中使用过滤器写了一些东西,但我只做了A级。这将是太多的代码行做B级,C级,D级等。我认为它可以更短,清洁使用循环或东西。任何人都可以帮我找到更有效的方法吗? http://jsfiddle.net/cM94j/2/

var list ={"PEOPLE": [
    {  "name": "Bob",  "level": "A",  "gender": "F"},
        {  "name": "Sue",  "level": "B", "gender": "F"},
       {  "name": "Molly",  "level": "A", "gender": "M"},
       {  "name": "Joe",  "level": "B", "gender": "N"},
        {  "name": "Jack",  "level": "B",  "gender": "F"}
        ]};

此外,这个名单最多只有80人和A-H级。与这些规格相关,我最好将这些数据放入某种类似excel的电子表格中。对于数据库来说,这不是一个足够大的项目。如果我去那条路线,我将如何输出到网站?我应该输出这些服务器端而不是使用jQuery吗?

2 个答案:

答案 0 :(得分:2)

以下是您可能想要使用的纯JS实现:

var list ={"PEOPLE": [
    {  "name": "Bob",   "level": "A",  "gender": "F"},
        {  "name": "Sue", "level": "B", "gender": "F"},
       {  "name": "Molly", "level": "A", "gender": "M"},
       {  "name": "Joe",  "level": "B", "gender": "N"},
        {  "name": "Jack", "level": "B",  "gender": "F"}
        ]};
var counts = {};
var gender = {
  F : "Female",
  M : "Male",
  N : "Neutral"
};
for(var i = 0; i < list.PEOPLE.length; i++){
  var key = list.PEOPLE[i].level + "_" + list.PEOPLE[i].gender;
  if(!counts[key]) counts[key] = 0;
  counts[key]++;
}
//try printing out the result
for(var prop in counts){
  var subKey = prop.split('_');
  var level = subKey[0];
  var gen = subKey[1];
  $('#dir2').append("Level " + level + " " + gender[gen] + 
                     ": " + counts[prop] + "<br/>");
}

如果您想获得组合的计数(在级别和性别之间),只需使用以下格式构建keylevel_gender(性别的缩写)并传入{{1获得计数。

Demo.

答案 1 :(得分:0)

使用underscore's groupBy方法

可以轻松完成分组
var grp=_.groupBy(list.PEOPLE, function(person){ return person.level+'_'+person.gender });

grp将是

Object {A_F: Array[1], B_F: Array[2], A_M: Array[1], B_N: Array[1]}

遗憾的是,您无法控制JS对象中的键顺序。