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

标签 javascript arrays angularjs

我有一个带有名称属性的对象数组...

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/

相关文章:

javascript - 错误 : [ng:areq] Argument is not a function, 未定义

javascript - RequireJS 使用多个数据主体

javascript - 如何在nodejs中将嵌套的JSON转换为excel

javascript - 使用 jquery 从上到下淡化和翻译 "position:absolute"元素

javascript - Webpack babel-loader es2015 预设设置不起作用

c++ - 模板结构作为数组

javascript - NG-重复具有重复值的对象,而不在输出上复制它,而不使用过滤器和外部依赖项

javascript - AngularJS ui-grid 获取所有网格数据以供导出

c# - 如何以非整数角度旋转二维数组

arrays - mongodb 中的合并聚合