【问题标题】:How to dynamically select the property by which my JSON object has to grouped by in Javascript如何在Javascript中动态选择我的JSON对象必须分组的属性
【发布时间】:2019-10-23 05:17:30
【问题描述】:

我正在尝试动态更改 JSON 对象必须按其分组的属性值。例如,如果我的搜索条件是位置,我想将员工的工作位置显示为键,并且该位置的员工没有成对显示,而该位置是 JSON 中的属性之一。

这是我到目前为止所做的。我能够根据位置及其作为键值对的计数对员工进行分组。

 var rows = [
    {
      "empId": 1,
      "empName": "aaa",
      "skillSet": "JAVA",
      "location": "chennai"
    },
    {
        "empId": 2,
        "empName": "bbb",
        "skillSet": "Angular",
        "location": "chennai"
    },
    {
        "empId": 3,
        "empName": "ccc",
        "skillSet": "Angular",
        "location": "chennai"
    },
    {
        "empId": 4,
        "empName": "ddd",
        "skillSet": "JAVA",
        "location": "bangalore"
    },
    {
        "empId": 5,
        "empName": "eee",
        "skillSet": "JAVA",
        "location": "chennai"
    },
    {
        "empId": 6,
        "empName": "fff",
        "skillSet": "JAVA",
        "location": "bangalore"
    },
    {
        "empId": 7,
        "empName": "ggg",
        "skillSet": "oracle",
        "location": "chennai"
    },
    {
        "empId": 8,
        "empName": "hhh",
        "skillSet": "JAVA",
        "location": "hyderabad"
    },
    {
        "empId": 9,
        "empName": "iii",
        "skillSet": "JAVA",
        "location": "hyderabad"
    }
  ] 

        var occurences = rows.reduce(function (r, row) {
          r[row.location] = ++r[row.location] || 1;
          return r;
      }, {});

      var result = Object.keys(occurences).map(function (key) {
          return { key: key, value: occurences[key] };
      });

      console.log(result);

我的结果是

[{
        "key": "chennai",
        "value": 5
    },
    {
        "key": "bangalore",
        "value": 2
    },
    {
        "key": "hyderabad",
        "value": 2
    }
]

如你所见,我已经直接硬编码了位置

r[row.location] = ++r[row.location] || 1;

相反,我想像我一样动态地制作,也应该能够使用其他属性(如 SkillSet)对其进行分组。但是怎么做。

【问题讨论】:

标签: javascript json angularjs


【解决方案1】:

创建一个接受参数keyName 的函数并将其用作row[keyName]

var rows = [{"empId":1,"empName":"aaa","skillSet":"JAVA","location":"chennai"},{"empId":2,"empName":"bbb","skillSet":"Angular","location":"chennai"},{"empId":3,"empName":"ccc","skillSet":"Angular","location":"chennai"},{"empId":4,"empName":"ddd","skillSet":"JAVA","location":"bangalore"},{"empId":5,"empName":"eee","skillSet":"JAVA","location":"chennai"},{"empId":6,"empName":"fff","skillSet":"JAVA","location":"bangalore"},{"empId":7,"empName":"ggg","skillSet":"oracle","location":"chennai"},{"empId":8,"empName":"hhh","skillSet":"JAVA","location":"hyderabad"},{"empId":9,"empName":"iii","skillSet":"JAVA","location":"hyderabad"}]

  function groupBy(keyName) {
      console.log("Group By :: ", keyName)
  
      var occurences = rows.reduce(function (r, row) {
          r[row[keyName]] = ++r[row[keyName]] || 1;
          return r;
      }, {});

      var result = Object.keys(occurences).map(function (key)       {
          return { key: key, value: occurences[key] };
      });

      console.log(result);
  }     
  
  groupBy("location");
  groupBy("skillSet");

【讨论】:

  • 我编辑了您的帖子,以便您可以更轻松地看到答案的重要部分。我希望没关系
  • 感谢@Phil 制作数据单行。顺便说一句,我也打算这样做:)
【解决方案2】:

你可以这样做

function groupEmployees(employees, grpKey) {
    const group = {};
    employees.forEach(emp => group[emp[grpKey]] = group[emp[grpKey]] ? group[emp[grpKey]] + 1 : 1);
    return group;
}
console.log(groupEmployees(rows, 'location')); // prints {chennai: 5, bangalore: 2, hyderabad: 2}
console.log(groupEmployees(rows, 'skillSet')); // prints {JAVA: 6, Angular: 2, oracle: 1}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2021-09-26
    • 2013-06-11
    相关资源
    最近更新 更多