如何在javascript中使用相同的键创build一个对象中数组的对象数组

我有一个看起来像这样的对象数组

[{ "name": "Agile Process", "id": 27, "score": 3, "source": "Self" },{ "name": "Agile Process", "id": 27, "score": 4, "source": "Trainer" },{ "name": "2 & 3 Tier Architecture", "id": 37, "score": 4, "source": "Self" },{ "name": "2 & 3 Tier Architecture", "id": 37, "score": 5, "source": "Trainer" }] 

我希望能够产生这样的东西,我一直在努力,但我似乎并没有得到它的一窍不通。

 [ { "name": "Agile Process", "id": 7, "data": [ { "score": 3, "source": "Self" },{ "score": 4, "source": "Trainer" } ] }, { "name": "2 & 3 Tier Architecture", "id": 37, "data": [ { "score": 4, "source": "Self" },{ "score": 5, "source": "Trainer" }] } ]; 

我该如何解决这个问题?

下面是一个纯JavaScript解决scheme:在初始数组上使用reduce方法,使用累加器结果数组(首先为空),这将存储转换的数据。 当reduce方法遍历初始数组的项时,检查结果数组是否包含当前项的id的元素。 如果是这样,那么只需添加新的数据,否则在结果数组中创build一个新的项目。

 var data = [{ "name": "Agile Process", "id": 27, "score": 3, "source": "Self" },{ "name": "Agile Process", "id": 27, "score": 4, "source": "Trainer" },{ "name": "2 & 3 Tier Architecture", "id": 37, "score": 4, "source": "Self" },{ "name": "2 & 3 Tier Architecture", "id": 37, "score": 5, "source": "Trainer" }]; var newData = []; newData = data.reduce(function(acc, current) { var existingArr = acc.filter(function(x) { return x.id === current.id }); if(existingArr.length === 0) { acc.push({ name: current.name, id: current.id, data: [{ score: current.score, source: current.source }] }); } else { existingArr[0].data.push({ score: current.score, source: current.source }); } return acc; }, newData); 

一种可能的方法:

 _.values(_.reduce(arr, function(acc, el) { var id = el.id; if (!acc.hasOwnProperty(id)) { acc[id] = _.pick(el, 'id', 'name'); acc[id].data = []; } acc[id].data.push(_.pick(el, 'score', 'source')); return acc; }, {})); 

演示 。 当你需要分组时,这是一种常用的方法。

此版本使用groupBy按id对项目进行分组,然后映射到每个分组以创build所需的对象:

 var groupToItem = function(items){ return { id: items[0].id, name: items[0].name, data: _.map(items, function(item){ return _.pick(item, 'score', 'source'); }) } } var result = _.chain(data) .groupBy('id') .map(groupToItem) .value(); 

简单的Javascript解决scheme,但只适用于您的特定数据结构:

 function groupObjectsById(array){ var output = []; var ids = []; for(var i = 0; i < array.length; i++){ var current = array[i]; if(ids.indexOf(current.id) > -1){ var objInOutput = output.filter(function(obj){ if(obj.id === current.id){ return obj; } })[0]; var dataObj = { score: current.score, source: current.source}; objInOutput.data.push(dataObj); }else{ var outputObject = {name: current.name, id: current.id}; outputObject.data = [{ score: current.score, source: current.source}]; output.push(outputObject); ids.push(current.id); } } return output; }