如何使用Javascript将具有相同名称的对象分组?

时间:2015-12-10 19:17:59

标签: javascript json node.js electron

使用Node,我实现了一个ID3标签解析器来获取MP3的标题,专辑和艺术家。

现在,我需要获取我已经收到的信息,然后按专辑名称对它们进行分组。

根据我的具体用法,我试图从

开始

此:

[
  { 
    title: 'Break You',
    artist: 'Lamb Of God',
    album: 'Ashes Of The Wake' 
  },
  {
    title: 'An Extra Nail For Your Coffin',
    artist: 'Lamb Of God',
    album: 'Ashes Of The Wake' 
  },
  {
    title: 'Envy And Doubt',
    artist: 'Sever The King',
    album: 'Traitor' 
  },
  {
    title: 'Self Destruct',
    artist: 'Sever The King',
    album: 'Traitor' 
  },
  ...
]

对此:(伪代码)

[
  'Ashes Of The Wake'{
    {
      title: 'Break You',
      artist: 'Lamb Of God'
    },
    {
      title: 'An Extra Nail For Your Coffin',
      artist: 'Lamb Of God'
    }  
  }
  'Traitor'{
    {
      title: 'Envy and Doubt',
      artist: 'Sever The King'
    },
    {
      title: 'Self Destruct',
      artist: 'Sever The King'
    }
  },
  ...
]

最好的方法是什么?我对JS来说比较新,所以可能很简单。

4 个答案:

答案 0 :(得分:6)

只需使用Array.prototype.forEach()

即可
  

forEach()方法每个数组元素执行一次提供的函数。



var data = [{ title: 'Break You', artist: 'Lamb Of God', album: 'Ashes Of The Wake' }, { title: 'An Extra Nail For Your Coffin', artist: 'Lamb Of God', album: 'Ashes Of The Wake' }, { title: 'Envy And Doubt', artist: 'Sever The King', album: 'Traitor' }, { title: 'Self Destruct', artist: 'Sever The King', album: 'Traitor' }],
    grouped = {};

data.forEach(function (a) {
    grouped[a.album] = grouped[a.album] || [];
    grouped[a.album].push({ title: a.title, artist: a.artist });
});
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您可以使用Array.prototype.reduce

var output = input.reduce(function(result, value) { 
  result[value.album] = result[value.album] || []; 
  result[value.album].push({ title: value.title, artist: value.artist });
  return result; 
}, {});

答案 2 :(得分:0)

  

OBS:'Wake'和'Traitor'应该是数组,而不是对象,因为它们有多个孩子。

您不必,但如果您想使用underscore,正如@Daniel所说,您可以使用groupBy功能。

var data = [
  { 
    title: 'Break You',
    artist: 'Lamb Of God',
    album: 'Ashes Of The Wake' 
  },
  {
    title: 'An Extra Nail For Your Coffin',
    artist: 'Lamb Of God',
    album: 'Ashes Of The Wake' 
  },
  {
    title: 'Envy And Doubt',
    artist: 'Sever The King',
    album: 'Traitor' 
  },
  {
    title: 'Self Destruct',
    artist: 'Sever The King',
    album: 'Traitor' 
  }
];
var groupedData = _.groupBy(data, 'album');
console.log(groupedData);

将输出:

[
  'Ashes Of The Wake': [
    {
      title: 'Break You',
      artist: 'Lamb Of God'
    },
    {
      title: 'An Extra Nail For Your Coffin',
      artist: 'Lamb Of God'
    }  
  ],
  'Traitor': [
    {
      title: 'Envy and Doubt,
      artist: 'Sever The King'
    },
    {
      title: 'Self Destruct',
      artist: 'Sever The King'
    }
  ]
]

JSFiddle

答案 3 :(得分:0)

正如Kieran建议的那样,使用underscore.js为您提供了一个简单优雅的解决方案。

var groupedData = _.groupBy(data, 'album');

这是羽毛球:http://plnkr.co/edit/a7DhxpGx0C4FVMgIjzPY?p=preview

修改

我想补充一点,如果你正在使用Node.js,你会想要使用lodash而不是下划线