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' ]
这个函数的返回怎么能以这种奇怪的方式排序?据我了解,它根本不应该改变阵列。
我说错了吗?
答案 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;
答案 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)