如何在排序之前保存数组的副本?

时间:2013-11-17 04:29:28

标签: javascript arrays sorting

我正在尝试保存数组的副本,然后才对其进行排序:

words_Array = ["Why", "doesnt", "this", "work?"];

var sortedWords_Array = words_Array;

sortedWords_Array.sort(function(a, b){
    return b.length - a.length;
});

alert("sortedWords_Array is :"+sortedWords_Array);
alert("words_Array is :"+words_Array);

在对sortedWords_Array进行排序之后,它们都因某种原因而被排序。 http://jsfiddle.net/zv39J/为什么?

4 个答案:

答案 0 :(得分:10)

因为在javascript中,数组是通过引用传递的,这意味着当你使一个数组等于另一个时,只要你对一个数组进行编辑,它就会改变。要在您的示例中修复此问题,请更改以下行:

var sortedWords_Array = words_Array;

为:

 //make a copy of array by using slice
 var sortedWords_Array = words_Array.slice(0);

请参阅此处了解其他用途和更深入的解释:

  

slice不会改变原始数组,但会返回一个新的“一级”   深度“复制,包含从中切出的元素的副本   原始阵列。

Array.prototype.slice()

答案 1 :(得分:2)

使用slice功能快速复制。

http://jsfiddle.net/zv39J/2/

另一方面 - 警报很糟糕。没有人想点击一个jsfiddle只是受到一系列警报窗口的欢迎。我已经更新了小提琴以包含jQuery,它允许我们使用一个很好的简洁语法来更新HTML。

答案 2 :(得分:2)

这不会起作用,因为当你尝试分配时 var sortedWords_Array = words_Array;

words_array的引用传递给sortedWords_Array。因此,对sortedWords_Array所做的任何更改都将反映在words_array上。

由于Array.slice()不进行深度复制,因此不适合多维数组:

var a =[[1], [2], [3]];
var b = a.slice();

b.shift().shift();
// a is now [[], [2], [3]]

请注意,虽然我上面使用了 shift()。shift(),但只是b[0][0]包含指向a[0][0]的指针而不是值。

同样delete(b[0][0])也会导致a[0][0]被删除,b[0][0]=99也会更改a[0][0] to 99.

的值 当真值作为初始参数传递时,

jQuery's extend方法会执行深层复制:

var a =[[1], [2], [3]];
var b = $.extend(true, [], a);

b.shift().shift();
// a is still [[1], [2], [3]]

答案 3 :(得分:1)

对数组执行slice()复制,然后排序。

var sortedWords_Array = words_Array.slice();
相关问题