如何使用JavaScript或节点对JSON进行分组?

如何使用JavaScript或节点对JSON进行分组?,javascript,json,node.js,Javascript,Json,Node.js,我有一个JSON的音乐音频元数据,其中包含以下结构中的几个曲目: var jsonObj = { tracks: [ { title: 'Another', artist: 'Ataxia', album: 'Automatic Writing', year: '2004', duration: 382 }] }; var jsonObj = { artists: [ { name: 'Ataxia', albums

我有一个JSON的音乐音频元数据,其中包含以下结构中的几个曲目:

var jsonObj = {
 tracks: [
   { title: 'Another',
     artist: 'Ataxia',
     album: 'Automatic Writing',
     year: '2004',
     duration: 382
   }]
};
var jsonObj = {
  artists: [
    { name: 'Ataxia',
      albums: [
       { name: 'Automatic Writing',
         year: '2004',
         tracks: [
          { title: 'Another',
            duration: '382'
          }]
       }]
    }]
 };
我想将其转换为以下分组结构:

var jsonObj = {
 tracks: [
   { title: 'Another',
     artist: 'Ataxia',
     album: 'Automatic Writing',
     year: '2004',
     duration: 382
   }]
};
var jsonObj = {
  artists: [
    { name: 'Ataxia',
      albums: [
       { name: 'Automatic Writing',
         year: '2004',
         tracks: [
          { title: 'Another',
            duration: '382'
          }]
       }]
    }]
 };

当然,我尝试过使用纯JavaScript forEach()方法来实现它,但这是一堆重复的、沉浸式的代码,我正在寻找一些聪明的解决方案。它可以依赖于一些外部Node.js包或JavaScript库

您可以执行以下操作(您需要查看控制台以查看结果):
var jsonObj={
轨道:[
{标题:'另一个',
艺术家:“共济失调”,
专辑:《自动写作》,
年份:“2004年”,
持续时间:382
}]
};
var jsonObjResult={};
jsonObj['tracks'].forEach(函数(track,index){
jsonObjResult['artists']=[];
jsonObjResult['artists'][索引]={
“名称”:曲目[“艺术家”]
,“相册”:
};
jsonObjResult['artists'][索引]['albums']={
“名称”:曲目[“唱片集”]
,“年”:轨道[“年”]
,“曲目”:[]
};
jsonObjResult['artists'][index]['albums']['tracks']={
“标题”:曲目[“标题”]
,“持续时间”:曲目[“持续时间”]
};
});

log(jsonObjResult)组合艺术家和专辑的简单方法是使用字典。这里有一种通过字典处理数据的方法,然后在按唱片集和艺术家组织曲目后生成所需的数组。在控制台中查看结果

var jsonObj={
轨道:[{
标题:"另一个",,
艺术家:“共济失调”,
专辑:《自动写作》,
年份:“2004年”,
持续时间:382
}]
};
var byArtist={};
jsonObj.tracks.forEach(函数(e){
if(按艺术家[e.artist]==未定义){
//新艺术家,添加到字典中
副艺术家{
艺术家:e.artist,
相册:{}
};
}
if(按艺术家[e.artist].albums[e.album]==未定义){
//新相册,添加到字典
byArtist[e.artist]。相册[e.album]={
姓名:e.album,
年份:e.year,
曲目:[]
};
}
//添加曲目
byArtist[e.artist]。相册[e.album]。曲目。推送({
标题:e.标题,
持续时间:即持续时间
});
});
//将字典转换为最终数组结构
var结果={
艺术家:[]
};
for(var artistKey in byArtist){
if(艺术家拥有自己的财产(艺术家钥匙)){
变量艺术家={
姓名:byArtist[artistKey]。艺术家,
相册:[]
};
//我们还需要转换相册字典
对于(艺术家[artistKey]中的var albumKey]。albums){
if(由艺术家[artistKey].albums.hasOwnProperty(albumKey)){
艺术家.albums.push(由艺术家[artistKey].albums[albumKey]);
}
}
结果.艺术家.推(艺术家);
}
}

控制台日志(结果)当我正努力将它转换成所需的格式时,我不得不搜索艺术家、搜索专辑、搜索曲目等等。。。因此,在思考这个问题时,我意识到您可能希望自己在最终的数据结构中使用这些函数,因此,我将生成的音乐列表制作成一个对象,其中包含各种方法,而不是编写用于将一个转换为另一个的一次性代码。其中一种方法是将曲目列表添加到音乐列表中,并按照您的要求进行组织

这里是这个对象和结果演示。我添加了两个以上的轨道只是为了更好地显示结果。这里的最终结果是你得到了一个包含音乐列表的对象,你得到了寻找艺术家、专辑和曲目的方法

var跟踪列表={
轨道:[
{标题:'另一个',
艺术家:“共济失调”,
专辑:《自动写作》,
年份:“2004年”,
持续时间:382
},
{标题:'另一个2',
艺术家:“共济失调”,
专辑:《自动写作》,
年份:2007年,
持续时间:412
},
{标题:'另一个3',
艺术家:“共济失调3”,
专辑:《自动写作》,
年份:2008年,
持续时间:366
},
]
};
函数音乐(){
这个.artists=[];
}
//辅助函数
//在对象数组中,它查找具有特定属性名称的对象
//具有特定的值。
函数findPropInArray(arr、propName、propValue){
对于(变量i=0;i