我有一个带有名称属性的对象数组...
var myList = [{
name: 'Apple'
}, {
name: 'Nervousness',
}, {
name: 'Dry'
}, {
name: 'Assign'
}, {
name: 'Date'
}]
本质上,我正在尝试创建一个这样设置的数组:
[{
name: 'A',
items: [{
name: 'Apple'
}, {
name: 'Assign'
}]
}, {
name: 'D',
items: [{
name: 'Date',
}, {
name: 'Dry',
}]
}, {
name: 'N',
items: [{
name: 'Nervousness',
}]
}];
基本上,我的对象数组需要按字母顺序排列,放入一个父键/值为“name”的新对象中,并带有相应的字母。
我可以按字母顺序排列它们......
myList.sort(function (a, b) {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
return 0;
});
然后我可以创建一个包含第一个字母的数组...
var headerLetters = [];
angular.forEach(myList, function (item) {
var firstLetter = item.name.charAt(0);
if (headerLetters.indexOf(firstLetter) === -1) {
headerLetters.push(firstLetter);
}
});
但这就是我卡住的地方......我可以检查是否有重复的首字母,但是我如何遍历我的对象列表并将它们按字母顺序插入新的对象数组?
最佳答案
假设您首先按字母顺序对它们进行排序,那么您始终可以只检查数组中的最新项,看看它是否与当前名称匹配。
var headerLetters = [];
angular.forEach(myList, function(item) {
var firstLetter = item.name[0];
var lastObj = headerLetters[headerLetters.length - 1];
if (!lastObj || lastObj.name !== firstLetter) {
lastObj = {
name: firstLetter,
items: []
};
headerLetters.push(lastObj);
}
lastObj.items.push(item);
});
关于javascript - 构造按字母顺序排列的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730056/