【问题标题】:Efficient way to Count Certain Grouped Values jQuery Array计算某些分组值jQuery数组的有效方法
【发布时间】:2014-06-13 15:03:29
【问题描述】:

我有很多人。我想获取按每个级别和性别组合分组的整个列表的计数。我想将这些结果存储在单独的变量中,我可以随时以任何顺序显示这些变量。

例如,获取 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 吗?

【问题讨论】:

  • 如果此信息来自数据库,请提供该信息。正如您发现的那样,自己做会很麻烦。
  • 很遗憾,此信息并非来自数据库。从长远来看,该名单最多有约 80 人,级别为 A-H。

标签: jquery arrays loops grouping


【解决方案1】:

这是您可能想要使用的纯 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(性别的缩写)并传入counts以获取计数.

Demo.

【讨论】:

  • 谢谢!是的,感谢您提出组合计数。我忘了我还需要每个级别的总数。
【解决方案2】:

使用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 对象中的键顺序。

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多