2017-04-13 75 views
-1

可能会因此而失败,但JS对我来说仍然是一个新的野兽。我已经得到了从数据库中的数据对象,并想了在一个JS数组对象是这样的组织:在JS中使用唯一键创建嵌套对象

[ A: [ 
     {"id": 28, "name": "Ackerman, William"}, 
     {"id": 18, "name": "Anderson, Sherry"}, 
    ], 
    B: [ 
     {"id": 42, "name": "Barry, Tristan"}, 
     {"id": 33, "name": "Baker, Lionel"}, 
    ], 
    C: [ 
     {"id": 79, "name": "Chen, Amy"}, 
     {"id": 21, "name": "Chen, Benjamin"}, 
     {"id": 86, "name": "Cornish, Jezebel"} 
    ] 
    ..... 
] 

所以我想唯一的关键是最后的名称和筑巢的信组中包含姓氏的人员列表。我只得到隔离独特的字母,但我把每个键下的名字列表丢失了。

var list = []; 
for(var i=0; i< employees.length; i++) { 
    var key = employees[i].firstletter; 
    var obj = {"id": employees[i].employee_id, "name": employees[i].last_name + ', '+ employees[i].first_name}; 
    var name = []; 
    name.push(obj); 
    list[key] = name;   
} 

当然,这只是给了我各组最后的结果......

+0

请加原始数据为好。 –

+0

您的第一个代码块中的语法不正确,fwiw:数组表示法不允许使用字母数字键;它只是一个值的列表。如果你想要字母数字键,你想要的是一个普通的对象初始值设定项('{}')。基本上,外层'[]'应该是'{}'。 – Pointy

回答

0

的问题是,你重新创建name阵列为每一位员工。相反,如果已经为该员工创建了一个数组(key),只需重新使用它即可。如果不是,创建一个新的:

var list = []; 
for(var i=0; i< employees.length; i++) { 
    var key = employees[i].firstletter; 
    var obj = {"id": employees[i].employee_id, "name": employees[i].last_name + ', '+ employees[i].first_name}; 
    var name = list[key] || []; 
    name.push(obj); 
    list[key] = name;   
} 

这工作,因为一个undefined结果(你有list[key]得到当list对象不包含key)是“falsy”,所以name变量将被分配一个在这种情况下是空数组。

0

您可以使用一个对象进行分组,并使用Array#forEach迭代该数组。

var data = [{ id: 28, firstname: 'William', lastname: 'Ackerman' }, { id: 18, firstname: 'Sherry', lastname: 'Anderson' }, { id: 42, firstname: 'Tristan', lastname: 'Barry' }, { id: 33, firstname: 'Lionel', lastname: 'Baker' }, { id: 79, firstname: 'Amy', lastname: 'Chen' }, { id: 21, firstname: 'Benjamin', lastname: 'Chen' }, { id: 86, firstname: 'Jezebel', lastname: 'Cornish' }], 
 
    grouped = Object.create(null); 
 

 
data.forEach(function (a) {    
 
    grouped[a.lastname[0]] = grouped[a.lastname[0]] || []; 
 
    grouped[a.lastname[0]].push({ id: a.id, name: [a.lastname, a.firstname].join(', ') }); 
 
}); 
 

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