[7,-2,2,-7,-3].sort() = [-2,-3,-7,2,-7]
以下是前端社团看到的解释 :
因为 JavaScript 默认的比较函
式是 (a, b) => a.toString().localeCompare(b)
也就是先将输入转为字串 (所以上述就是 "-" 排在数字之前比较,第二个字符再来比顺序),并依据区域化设定而会不同的排序结果 —— 举例来说,如果你的语系设定为捷克语 (分类上算是西斯拉夫语支),以 "CH" 开头的字串要排在 "H" 之后,但单看字母的话,"C" 要在 "B" 之后。
光是排序的规则就可以探讨一阵子,我们该如何诚实面对自身对 JavaScript 的无力呢?
想请问大家怎么解决JS的排序问题呢?
有推荐的第三方库?
更新。
尝试第一种方式 : JavaScript中sort方法排序不正确解决办法_weixin_36309908的博客-CSDN博客。
var arr = [7,-2,2,-7,-3];
arr.sort(function (a,b) {
if (a < b ) return -1;
if (a > b ) return 1;
return 0;
});
结果 : 可以,但需要每一次排序自己实现方法。
尝试2 :从 V8 源码看 JS 数组排序的诡异问题 - 前端高级 - SegmentFault 思否。
var arr = [7,-2,2,-7,-3];
arr.sort((x, y) => x - y);
結果 : OK,而且也簡短好多,但會有跟結果可能會不一樣問題,貞操蛋 = v =先map再sort
`先sort再map`
文中補充 :
如果 等於 , 和 的相對位置不變。備註:ECMAScript 標準並不保證這一行為,而且也不是所有瀏覽器都會遵守。
翻譯成編程術語就是: 排序算法是不穩定排序。comparefn(a, b)
`0a
b`sort
先map再sort
跟結果可能會不一樣問題先sort再map
//異常排序
var data = [
{value: 4},
{value: 2},
{value: undefined},
{value: undefined},
{value: 1},
{value: undefined},
{value: undefined},
{value: 7},
{value: undefined},
{value: 4}
];
data
.sort((x, y) => x.value - y.value)
.map(x => x.value);
// result : (10) [2, 4, undefined, undefined, 1, undefined, undefined, 4, 7, undefined]
//能正常排序
var data = [
{value: 4},
{value: 2},
{value: undefined},
{value: undefined},
{value: 1},
{value: undefined},
{value: undefined},
{value: 7},
{value: undefined},
{value: 4}
];
data
.map(x => x.value)
.sort((x, y) => x.value - y.value);
// result : [4, 2, 1, 7, 4, undefined, undefined, undefined, undefined, undefined]
尝试 3 :
listennn08
: lodash
_.sortBy(data, (el) => el.value)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script>
//能正常排序
var data = [
{value: 4},
{value: 2},
{value: undefined},
{value: undefined},
{value: 1},
{value: undefined},
{value: undefined},
{value: 7},
{value: undefined},
{value: 4}
];
var sorted =
_.map(
_.sortBy(data, (el) => el.value)
,(el) => el.value
)
;
console.log(sorted);//[1, 2, 4, 4, 7, undefined, undefined, undefined, undefined, undefined]
</script>
结果 : 目前测试以来
效果最好的 文件 : lodash.map |。 Lodash 中文网。
我的天写个比较大小的方法也叫麻烦。。。
嫌麻烦你可用underscore, loadsh,ramda等等等等