javascript - 从对象数组创建新对象并按特定匹配键/值分组

标签 javascript

我正在处理的对象数据示例

var myData = [{
  "name": "John",
  "age": 30,
  "interest": "Baseball"
},
{
  "name": "Bob",
  "age": 21,
  "interest": "Baseball"
},
{
  "name" : "Sally",
  "age" : 29,
  "interest": "Tennis"
}]

我正在尝试找出按兴趣对它们进行分组的最简单方法。我愿意使用 lodash 或下划线,但我无法让最终结果看起来像这样....

我希望这是输出:

[{ "Baseball" : [{
                  "name": "John",
                  "age" : 30
                 },
                 {
                  "name" : "Bob",
                  "age" : 21
                 }]
 },
 { "Tennis" : [{
                 "name" : "Sally",
                 "age" : 21
               }]
 }];

基本上,每个兴趣都会成为一个新的对象键,其中包含数组中的所有匹配值。

我在构造此输出时遇到问题。任何帮助将不胜感激。我更喜欢使用 lodash/underscore 来让事情变得简单。

谢谢!

最佳答案

您可以为此使用 Array.reduce:

var myData = [
{
  "name": "John",
  "age": 30,
  "interest": "Baseball"
},
{
  "name": "Bob",
  "age": 21,
  "interest": "Baseball"
},
{
  "name" : "Sally",
  "age" : 29,
  "interest": "Tennis"
}];

var result = myData.reduce(function(entities, obj) {
   entities[obj.interest] = (entities[obj.interest] || []).concat({
      name: obj.name,
      age: obj.age
   });
   return entities;
}, {});
console.log(result);

更通用的方法:

function groupBy(data, key, tFunc) {
   mapFunc = (typeof tFunc === "function")? tFunc: function(o) { return o };
   return (Array.isArray(data)?data:[]).reduce(function(entities, o) {
     if(o[key]) {
       entities[o[key]] = (entities[o[key]] || []).concat(tFunc(o));
     }
     return entities;
   }, {});
}


// test code
var myData = [
{
  "name": "John",
  "age": 30,
  "interest": "Baseball"
},
{
  "name": "Bob",
  "age": 21,
  "interest": "Baseball"
},
{
  "name" : "Sally",
  "age" : 29,
  "interest": "Tennis"
}];

var result = groupBy(myData, "interest", function(o) { return { name: o.name, age: o.age}});
console.log(result);
var result2 = groupBy(myData, "age", function(o) { return o.name});
console.log(result2);

关于javascript - 从对象数组创建新对象并按特定匹配键/值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42659551/

相关文章:

javascript - 将 jQuery onClick 切换为 keyCode

javascript - 重定向到本地 html 文件无法在同一窗口中打开

Java、JavaScript : Avoid escaping particular HTML tags

javascript - 如何在javascript中获取字符串中的单词总数

javascript - Angular - 如何使用延迟加载模块激活 AUX 路由?

javascript - 如何根据索引数组更改元素的状态?

javascript - 发布时出现错误的表单数据名称

javascript - 如何拆分ajax结果

javascript - 如何使用javascript更改表中的元素

javascript - 如何使用 HTML 和 javascript 从表单框中显示 URL?