为什么在这种情况下排序修改原件?

时间:2012-03-31 02:53:45

标签: javascript sorting

我遇到了一个让原始数组发生变化的问题,奇怪的是添加arr.join("...").split("...")似乎阻止了这个:

一点背景:

  • 我的脚本会创建并添加内容到array
  • 此数组初始化为空,如arr=[]
  • 通过arr[index] = "..."
  • 添加内容
  • 然后我想要一份arr但已排序
  • 的副本
  • 当我进行排序时,orignial arr被修改

以下是正在进行的简化版本:

var arr=[], sorted;

arr[0] = "hello";
arr[1] = "world";

//buggy, the original is sorted
//sorted = arr.sort(function(a,b){return (a.length-b.length);});

sorted = arr.join("improbableCollision").split("improbableCollision").sort(function(a,b){return (a.length-b.length);});
  • 为什么添加.join("*").split("*")可以解决问题?
  • 导致问题的原因是什么?
  • 有更优雅的方法来解决这个问题吗?

有关完整脚本,请查看此jsFiddle

2 个答案:

答案 0 :(得分:3)

要进行排序而不进行所有连接和拆分,请使用切片或concat复制数组:

var sorted = arr.slice(0).sort()

答案 1 :(得分:2)

这是有效的,因为join()然后split()操作会产生原始数组的副本。