javascript排序函数排序时不应该排序

时间:2016-03-30 08:28:39

标签: javascript sorting

function longest(arr) {
  return arr.sort( (a,b) => {
    return a.length - b.length;
  });
}
var res = longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k','l']);
console.log(res); // -> [ 'f', 'a', 'c', 'd', 'e', 'b', 'g', 'h', 'i', 'k', 'l' ]

这个函数的返回怎么能以这种奇怪的方式排序?据我了解,它根本不应该改变阵列。

我说错了吗?

4 个答案:

答案 0 :(得分:10)

Array.protoype.sort不保证稳定。不保证相等的元素将保留其原始顺序。

  

sort()方法对数组中的元素进行排序并返回数组。 排序不一定是stable默认排序顺序是根据字符串Unicode代码点。

     

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

答案 1 :(得分:3)

您可以使用原始数组项的位置添加默认排序。 (为了更好地使用Sorting with map。)



function longest(arr) {
    var copy = arr.slice();
    return arr.sort(function (a, b) {
        return a.length - b.length || copy.indexOf(a) - copy.indexOf(b);
    });
}
var res = longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l']);
document.write('<pre>' + JSON.stringify(res, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:0)

如果你想按升序排序,那么比较器函数应该是a - b而不是a.length - b.length,因为a.length - b.length对于长度为1的所有字母表,结果总是为零。[&#39; ab&#39;&#39; a&#39;]的结果会有所不同,因为长度会产生[&#39; a&#39;&#39; ab&#39;]数组中的第一个元素小于第二个元素。

function longest(arr) {
  return arr.sort( (a,b) => {
    return a - b;
  });
}

答案 3 :(得分:0)

如上所述here

  

如果compareFunction(a,b)返回0,则保持a和b不变   相互尊重,但相对于所有不同的排序   元素。注意:ECMAscript标准不保证这一点   行为,因而并非所有浏览器(例如Mozilla版本约会   至少回到2003年)尊重这一点。

请记住,示例中比较函数的返回始终为0,并且还引用了this主题中的答案,您可以看到不同的浏览器如何以不同的方式对元素进行迭代。因此,您的案例的结果是可预期的,并且可能从浏览器到浏览器变化