首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JS对象列表划分为具有公共对象属性的子项列表

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

Stack Overflow用户
提问于 2016-11-29 18:49:30
回答 2查看 844关注 0票数 1

给定此JS对象列表:

代码语言:javascript
复制
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的对象,如下所示:

代码语言:javascript
复制
 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中的每个项创建一个列表。

EN

回答 2

Stack Overflow用户

发布于 2016-11-29 18:53:27

使用Array#reduce方法和一个包含索引的额外引用对象来实现。

代码语言:javascript
复制
// 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
}, []);

代码语言:javascript
复制
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);

票数 0
EN

Stack Overflow用户

发布于 2016-11-29 18:55:41

您可以使用哈希表对其进行分组

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40863949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档