排序数组而不改变顺序

时间:2013-12-12 10:23:25

标签: javascript sorting

我试图在JS中找到一种方法来排序数组,而不是实际更改元素的顺序,而是更像是“分组”功能。

示例数据:

[
  {group: 'test',  title: 'A'},
  {group: 'test',  title: 'B'},
  {group: 'test2', title: 'C'},
  {group: 'test',  title: 'D'}
]

我的想法是按照最终订单的方式[].sort()进行:

[
  {group: 'test',  title: 'A'},
  {group: 'test',  title: 'B'},
  {group: 'test',  title: 'D'},
  {group: 'test2', title: 'C'}
]

意思是:我没有改变前两个项目的顺序,但由于他们的小组只改变了#3和#4。如果我使用经典的localeCompare,我最终会根据他们的价值恢复我的团队,这不是我想要的,他们的订单应该保留。

编辑:考虑到答案,我想重新澄清我想要更改组的顺序,意味着他们按字母顺序排序但是相反,它们应按照它们出现的顺序进行分组。

3 个答案:

答案 0 :(得分:0)

您需要为Array.sort

提供自定义比较功能
var a = [
  {group: 'test', title: 'A'},
  {group: 'test', title: 'B'},
  {group: 'test2', title: 'C'},
  {group: 'test', title: 'D'}
];

function myComparisonFunction(a1, b1) {
    return a1.group < b1.group ? -1 : a1.group === b1.group ? 0 : 1;
}

a.sort(myComparisonFunction);

console.log(a);

答案 1 :(得分:0)

试试这个:

function compare(b,c) {
  if (b.title < c.title)
     return -1;
  if (b.title > c.title)
    return 1;
  return 0;
}

objs.sort(compare);

答案 2 :(得分:0)

您可以尝试使用与此类似的比较功能:

function comp(a, b) {
  if (a.group == b.group) {
    return a.title < b.title ? -1 : a.title == b.title ? 0 : 1;
  }
  return a.group < b.group ? -1 : 1;
}

youArray.sort(comp)

如果我正确理解了您的问题,您希望先对群组进行排序,但如果您的群组相同,则排序title