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

[7,-2,2,-7,-3].sort() = [-2,-3,-7,2,-7]

xxx

以下是前端社团看到的解释 :

因为 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;
});

结果 : 可以,但需要每一次排序自己实现方法。
xxx

尝试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)`0ab`sort

xxx
先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 中文网

阅读 2.7k
4 个回答

我的天写个比较大小的方法也叫麻烦。。。
嫌麻烦你可用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])

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

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

被标题吸引进来的。怎么突然“7”不见了!哦,原来是手误

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏