鉴于此JS对象列表:
var items = [
{
'name':'a',
'id':'ab-1',
'attr':'value1'
},
{
'name':'c',
'id':'ab-2',
'attr':'value0'
},
{
'name':'z',
'id':'ab-1',
'attr':'value2'
},
{
'name':'t',
'id':'ab-2',
'attr':'value3'
}
]
是否有一种很好的方法来创建列表列表,其中每个列表包含具有公共ID的对象,如下所示:
var items = [
[
{
'name':'a',
'id':'ab-1',
'attr':'value1'
},
{
'name':'z',
'id':'ab-1',
'attr':'value2'
}],
[
{
'name':'c',
'id':'ab-2',
'attr':'value0'
},
{
'name':'t',
'id':'ab-2',
'attr':'value3'
} ]
]
我只能想到首先循环遍历所有项目以创建唯一ID列表(让我们称之为id-list),然后再次遍历所有项目,这次为id-list中的每个项目创建一个列表。
答案 0 :(得分:0)
使用Array#reduce
方法和另一个包含索引的参考对象。
// object for storing the reference index
var ref = {};
// iterate over array and generate result object
var res = items.reduce(function(arr, o) {
// check index defined in `ref`
if (ref.hasOwnProperty(o.id))
// if defined then push value to that index
arr[ref[o.id]].push(o);
// else add index and push new array as element
else {
ref[o.id] = arr.length;
arr.push([o]);
}
// return the array reference
return arr;
// set initial valaue as empty array
}, []);
var items = [{
'name': 'a',
'id': 'ab-1',
'attr': 'value1'
}, {
'name': 'c',
'id': 'ab-2',
'attr': 'value0'
}, {
'name': 'z',
'id': 'ab-1',
'attr': 'value2'
}, {
'name': 't',
'id': 'ab-2',
'attr': 'value3'
}];
// object for storing the reference index
var ref = {};
// iterate over array and generate result object
var res = items.reduce(function(arr, o) {
// check index defined in `ref`
if (ref.hasOwnProperty(o.id))
// if defined then push value to that index
arr[ref[o.id]].push(o);
// else add index and push new array as element
else {
ref[o.id] = arr.length;
arr.push([o]);
}
// return the array reference
return arr;
// set initial valaue as empty array
}, []);
console.log(res);
答案 1 :(得分:0)
您可以使用哈希表对其进行分组
var items = [{ name: 'a', id: 'ab-1', attr: 'value1' }, { name: 'c', id: 'ab-2', attr: 'value0' }, { name: 'z', id: 'ab-1', attr: 'value2' }, { name: 't', id: 'ab-2', attr: 'value3' }],
grouped = [];
items.forEach(function (a) {
this[a.id] || grouped.push(this[a.id] = []);
this[a.id].push(a);
}, Object.create(null));
console.log(grouped);

.as-console-wrapper { max-height: 100% !important; top: 0; }