【问题标题】:Sort array without changing order对数组进行排序而不更改顺序
【发布时间】:2013-12-13 20:26:59
【问题描述】:

我试图在 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,我最终会根据我不想要的价值恢复我的组,他们的顺序应该保留。

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

【问题讨论】:

标签: javascript sorting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      你可以试试类似这样的比较函数:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多