【问题标题】:Why can't JavaScript sort [5, 10, 1]? [duplicate]为什么 JavaScript 不能排序 [5, 10, 1]? [复制]
【发布时间】:2014-01-27 23:38:28
【问题描述】:

这似乎是一种简单的排序,但 JavaScript 给出的结果不正确。

是我做错了什么还是语言怪癖?

[5, 10, 1].sort();

[1,10,5]

【问题讨论】:

  • 对于词法顺序来说似乎是完全有序的。
  • 我讨厌引用阿特伍德的话,但是...the first rule of programming 在这里很重要。

标签: javascript sorting


【解决方案1】:

Javascript 按字母顺序排序。这意味着“10”低于“5”,因为“1”低于“5”。

要对数值进行排序,您需要像这样传入数值比较器:

function sorter(a, b) {
  if (a < b) return -1;  // any negative number works
  if (a > b) return 1;   // any positive number works
  return 0; // equal values MUST yield zero
}

[1,10, 5].sort(sorter);

或者你可以通过传递更简单的函数来作弊:

function sorter(a, b){
  return a - b;
}

[1, 10, 5].sort(sorter);

这个较短函数背后的逻辑是比较器必须返回x&gt;0 if a &gt; bx&lt;0 if a &lt; bzero if a is equal to b。所以如果你有

a=1 b=5
a-b will yield negative(-4) number meaning b is larger than a

a=5 b=1
a-b will yield positive number(4) meaning a is larger than b

a=3 b=3
a-b will yield 0 meaning they are equal

【讨论】:

  • 代码太多了!
  • @KellyJAndrews 在哪里?第二种方法被广泛使用。当然,如果您更喜欢 size > readability,您可以直接内联并缩小它
  • 我在一行中做了我的例子,你使用的最小的是 3。
  • @KellyJAndrews 谈到可重用性,如果您使用 yoursort 5 次,我的代码将在可读性、可重用性、DRY 方法方面击败您的代码,如果您对我的方法不满意,只需删除两个换行符
  • 此代码可以使用Arrow Function 缩短。 numberArray.sort((a, b) =&gt; (a - b)); 注意:检查你的 JS 引擎是否支持箭头函数。
【解决方案2】:

您必须将一个函数传递给 sort 方法。

var points = [5, 10, 1];
points.sort(function(a,b){return a-b});

Here 是一个工作小提琴。

【讨论】:

  • 另外 - this 是 W3C 学校的详细信息。
  • W3C 学校是一个不好的参考
  • 它的名声不好,但我认为对于简单的基础来说,它是准确的。
【解决方案3】:

默认排序顺序是字母和升序。如果你想对数字进行排序,你可以这样做:

function sortNumber(a,b) {
    return a - b;
}

var numArray = [140000, 104, 99];
numArray.sort(sortNumber);

【讨论】:

    【解决方案4】:
    function sortit(a, b){ return (a-b); }
    [1, 5, 10].sort(sortit);
    

    【讨论】:

      【解决方案5】:

      你可以试试:

      [5, 10, 1].sort(function(a, b){ return a - b })   # print [1, 5, 10]
      

      【讨论】:

        【解决方案6】:

        你可以试试

        [5, 10, 1].sort(function(a,b){return a-b})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-19
          • 2019-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-19
          • 1970-01-01
          相关资源
          最近更新 更多