【问题标题】:Constructing alphabetized array of objects构造按字母顺序排列的对象数组
【发布时间】:2016-01-11 20:02:49
【问题描述】:

我有一个具有 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',
  }]
}];

基本上,我的对象数组需要按字母顺序排列,放入一个新对象,其父键/值为“名称”,并带有相应的字母。

我可以将它们按字母顺序排列如下...

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

但这就是我卡住的地方......我可以检查重复的第一个字母,但是我将如何遍历我的对象列表并将它们按字母顺序推送到新的对象数组中?

【问题讨论】:

    标签: javascript arrays angularjs


    【解决方案1】:

    假设您首先按字母顺序对它们进行排序,那么您总是可以检查数组中的最新项目,看看它是否与当前名称匹配。

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

    【讨论】:

    • 太棒了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 2021-06-25
    • 2023-01-30
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多