我正在尝试通过使用相同的ID来粘贴多个对象来创建更整洁的JSON对象。 这是我尝试过的: 1.存储第一个对象的ID以匹配后续ID。 2.迭代数组并检查类似的ID,如果返回匹配项,则将名称作为另一个数组中的对象推送,否则将推入具有存储名称作为属性的新对象。 3.空名。
有很多条件可以检查对象是否是数组的最后一个元素。我只是在寻找一种实现这一目标的优化方法。考虑到问题的具体性质,我无法在SO中找到确切的类似问题。
我有一个JSON对象,如:
[
{
id: 1,
name: 'John'
},
{
id: 1,
name: 'Jack'
},
{
id: 2,
name: 'Drake'
},
{
id: 2,
name: 'Joey'
},
{
id: 3,
name: 'Justin'
},
{
id: 3,
name: 'Rob'
}
]
我想把具有类似ID的对象聚集在一起,有点像这样:
[{
id: 1,
names: [{
name: 'John'
},
{
name: 'Jack'
}]
},
{
id: 2,
names: [{
name: 'Drake'
},
{
name: 'Joey'
}]
},
{
id: 3,
names: [{
name: 'Justin'
},
{
name: 'Rob'
}]
}]
答案 0 :(得分:2)
您可以使用Array#forEach
和哈希的对象。
var data = [{ id: 1, name: 'John' }, { id: 1, name: 'Jack' }, { id: 2, name: 'Drake' }, { id: 2, name: 'Joey' }, { id: 3, name: 'Justin' }, { id: 3, name: 'Rob' }],
grouped = [];
data.forEach(function (a) {
if (!this[a.id]) {
this[a.id] = { id: a.id, names: [] };
grouped.push(this[a.id]);
}
this[a.id].names.push({ name: a.name });
}, Object.create(null));
console.log(grouped);

答案 1 :(得分:1)
将 Array#reduce
方法与索引引用对象一起使用。
var data = [{ id: 1, name: 'John'}, { id: 1, name: 'Jack'}, { id: 2, name: 'Drake'}, { id: 2, name: 'Joey'}, { id: 3, name: 'Justin'}, { id: 3, name: 'Rob'}];
// object for index reference
var ind = {};
// iteraate over array
var res = data.reduce(function(arr, obj) {
// check index defined already
if (ind.hasOwnProperty(obj.id)) {
// if defined then push the name value
arr[ind[obj.id]].names.push({name: obj.name});
} else {
// else push a new object in prefered format
arr.push({ id: obj.id, names: [{ name: obj.name }] });
// define the index in reference object
ind[obj.id] = arr.length - 1;
}
// return the updated array
return arr;
// set initial value as epty array
}, []);
console.log(res);