功能非破坏性数组排序

Hur*_*elu 53 javascript arrays sorting

除了克隆数组然后对其进行排序的本地方式之外,是否存在更适合非破坏性排序的算法和现有实现?

需要在不更改源的情况下将浮点数组排序到新数组中.我的搜索结果相当薄,因为大多数文献都专注于通过就地排序来降低内存需求.

使用本机sorted = [].slice().sort()工作正常.这个问题是关于理解是否存在其他高性能排序实现,因为无论如何都需要新的数组,因此删除了内存约束.

shu*_*ird 55

有一种更简单的语法,可以使用ES6扩展运算符对数组进行不可变的排序:

[...array].sort(sortFn)
Run Code Online (Sandbox Code Playgroud)

  • @robertmain,实际上,这样更好.因为排序不会改变包含的对象.克隆包含的对象会破坏其他地方的浅层比较,使得优化变得非常困难. (9认同)
  • 除了扩展不能进行深度克隆之外,所以如果它是具有多个级别的对象数组,那么您对此就有点熟练了。 (3认同)

Sze*_*sui 42

由于评论重复了几次:

  1. shuffledArray.slice().sort() 是默认的方式.
  2. 我们如何能够使用您提到的库获得更好的算法/方法并不是很清楚.

看作非破坏性排序的动机与编写功能代码有关,你正在看Ramda ...如果你还没有,请查看Facebook的ImmutableJS库.

特别是Seq.您可以开始将浮点数组存储在a中Seq,对其进行排序,并确保原始Seq保持正确的顺序.此外,它还利用了Lazy评估. http://facebook.github.io/immutable-js/docs/#/Seq
http://facebook.github.io/immutable-js/docs/#/Seq/sortBy