将JS对象列表划分为具有公共对象属性的项目的子列表

时间:2016-11-29 10:49:30

标签: javascript

鉴于此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中的每个项目创建一个列表。

2 个答案:

答案 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; }