在不更改顺序的情况下对数组进行排序

Sort array without changing order

本文关键字:数组 排序 情况下 顺序      更新时间:2023-09-26

我正试图在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,我最终会根据它们的值来恢复我的组,这不是我想要的,它们的顺序应该保持。

编辑:考虑到答案,我想再次澄清,我确实想要更改组的顺序,这意味着它们应该按字母顺序排序,而是应该按出现的顺序分组。

您需要为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);

试试这个:

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

您可以尝试使用类似以下的比较函数:

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排序。