H5W3
当前位置:H5W3 > 其他技术问题 > 正文

如何解决 JavasSript [7,-2,2,-7,-3].sort() = [-2,-3,-7,2,-7] 问题?

[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,而且也简短好多,但会有浏览器间的兼容问题(先map再sort先sort再map结果可能会不一样),贞操蛋 = v =

回答

你这方法一和方法二没什么区别呀

你所说兼容性问题应该是不存在的,目前list.sort((a, b) => a - b)应该是被浏览器广泛支持的,并且符合你的需求

我的天写个比较大小的方法也叫麻烦。。。
嫌麻烦你可用underscore, loadsh,ramda等等等等

const n = _.sortBy([7,-2,2,-7,-3]);
console.log(n);

R.sortWith([R.descend(Number)])([7,-2,2,-7,-3])
R.sortWith([R.ascend(Number)])([7,-2,2,-7,-3])

未经允许不得转载:H5W3 » 如何解决 JavasSript [7,-2,2,-7,-3].sort() = [-2,-3,-7,2,-7] 问题?

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址