构造按字母顺序排列的对象数组

Constructing alphabetized array of objects

本文关键字:排列 对象 数组 顺序      更新时间:2023-09-26

我有一个带有name属性的对象数组。。。

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);
});