我有一个对象数组,有些对象共享相同的id,是否可以快速嵌套它们以便对它们进行分组,例如:
var items = [
{ id: 5, title: 'wow', name: 'item1' },
{ id: 5, title: 'wow', name: 'item2' },
{ id: 26, title: 'latest', name: 'item3' },
{ id: 26, title: 'latest', name: 'item4' }
];
要:
var items = [
[{ id: 5, title: 'wow', name: 'item1' },
{ id: 5, title: 'wow', name: 'item2' } ],
[{ id: 26, title: 'latest', name: 'item3' },
{ id: 26, title: 'latest', name: 'item4' } ]
];
如果您事先没有关于这些对象的任何细节,我可以使用简单的循环,但我正在寻找一个更短,更智能的解决方案,如果有一个,例如:对于每个项目组中的每个id在数组或其他东西下。
答案 0 :(得分:1)
使用对象临时存储键为id的对象,然后遍历临时对象,将存储的对象添加到输出数组中:
function group(items){
var temp = {};
var out = [];
for (var i = 0, l = items.length; i < l; i++) {
var id = items[i].id;
if (!temp[id]) temp[id] = [];
temp[id].push(items[i]);
}
for (var p in temp) {
out.push(temp[p]);
}
return out;
}
答案 1 :(得分:1)
你可以试试这个:
function groupBy(array, f) {
var groups = {};
array.forEach(function (o) {
var group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function (group) {
return groups[group];
})
}
var groupedById = groupBy(items, function (item) {
return [item.id];
});
console.log(groupedById)
答案 2 :(得分:1)
好的,为了多样性,你有两个好的循环解决方案。这是一个Array.prototype.reduce
(虽然使用像这样的减少可能不是那么聪明):
var items = [
{ id: 5, title: 'wow', name: 'item1' },
{ id: 5, title: 'wow', name: 'item2' },
{ id: 26, title: 'latest', name: 'item3' },
{ id: 26, title: 'latest', name: 'item4' }
];
var result = items.reduce(function(prev, curr, index, array) {
if (!prev.cache[curr.id]) {
prev.data.push(prev.cache[curr.id] = []);
}
prev.cache[curr.id].push(curr);
return index === array.length - 1 ? prev.data : prev;
}, {data: [], cache: {}});
document.write('<pre>' + JSON.stringify(result, null, 4) + '</pre>');
&#13;