【问题标题】:Array sorting with condition in Javascript在Javascript中使用条件进行数组排序
【发布时间】:2020-12-12 01:30:36
【问题描述】:

我需要按升序对数组进行排序,并将所有零放在最后。

例如 [0, 0, 0, 3, 2, 1] 需要排序为 [1, 2, 3, 0, 0, 0]。 这是我的代码,我需要添加什么以确保所有零都在末尾?

function sort_by_field(array, field){
                return array.sort(function(a, b){
                    if( a[field] > b[field] ){
                        return 1;
                    }
                    if( a[field] < b[field] ){
                        return -1;
                    }
                    return 0;
                });
            }

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    你可以这样做:

    [0, 0, 0, 3, 2, 1].sort(function(a,b){ 
        if(a === 0) return 1;
        else if(b === 0) return -1;
        else return a - b;
    });
    

    【讨论】:

      【解决方案2】:

      在进行其他比较之前,只需检查特殊情况是否为零。所以比较函数可能是这样的:

      function(a, b) {
          if (a === b)
              return 0;
          if (a === 0)
              return 1;
          else if (b === 0)
              return -1;
      
          //the rest of the comparison logic
      }
      

      对于一些排序算法来说,比较函数超级一致是非常重要的,这就是为什么我一开始就特意比较两者是否相等的原因。

      【讨论】:

        【解决方案3】:

        您可以取 falsy 值的 delta,然后按值排序。

        console.log([0, 0, 0, 3, 2, 1].sort((a, b) =&gt; !a - !b || a - b));

        【讨论】:

          【解决方案4】:
          const sortArrByCondition = (arr, func) =>
            arr.sort((oA, oB) => func(oA, oB)? 1: func(oB, oA)? -1 : 0)
          
          sortByCondition (arr, (a, b) => a > b);
          

          sortByCondition 适用于字符串、数字和布尔值,以及返回布尔值的更复杂的函数。

          【讨论】:

          • (-1) ** Number(func(a, b)) 应该实现什么? This doesn't work.
          • func(a, b) ? 1 : -1相比仍然看起来过于复杂......
          • @Bergi,很抱歉删除我的评论。我想重读你的参考资料。你还觉得行不通吗?我同意您的最新评论,并将相应调整我的回答。
          • 是的,我仍然认为不返回 0 以获得相同的项目不是一个好主意
          • @Bergi 我同意。稳定性对于排序功能很重要。回想起来,我不会添加答案。但是为了讨论,我的编辑是否解决了问题?
          猜你喜欢
          • 2021-02-23
          • 1970-01-01
          • 2018-11-01
          • 2012-11-02
          • 2023-01-08
          • 2022-11-02
          • 1970-01-01
          • 2018-04-30
          • 1970-01-01
          相关资源
          最近更新 更多