如何在排序之前保存数组的副本? [复制]

Posted

技术标签:

【中文标题】如何在排序之前保存数组的副本? [复制]【英文标题】:How do I save a copy of an array before sorting? [duplicate] 【发布时间】:2013-11-30 09:19:24 【问题描述】:

我正在尝试在排序之前保存数组的副本:

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/这是为什么呢?

【问题讨论】:

“为什么会这样?” 因为words_ArraysortedWords_Array 指的是同一个数组。将数组分配给变量不会创建它的副本。 我想试试。谢谢 好的。抱歉重复的问题,我没有找到它。只要他们允许,我就会投票正确。谢谢大家。 【参考方案1】:

这不起作用,因为当您尝试分配 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]]

【讨论】:

谢谢。这也是一个非常深入的答案。如果将来我需要复制多维数组,我一定会看看它。非常感谢。【参考方案2】:

使用slice 函数进行快速复制。

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

另一方面,警报很糟糕。没有人想点击一个 jsfiddle 只是被一系列警报窗口打招呼。我更新了 fiddle 以包含 jQuery,它允许我们使用简洁的语法来更新 html

【讨论】:

@Squirrl - 您不需要接受我的回答,但请注意我对您的 jsfiddle 中的警报的评论。如果将来您在我更新的小提琴中使用更像这种格式而不是使用警报,我相信每个人都会很感激。 好的。我道歉。从现在开始做。再次感谢。 @Squirrl - 好的,太好了!感谢您首先发布 jsfiddle。这确实使您更容易正确地使用您的代码。当它不使用警报来显示结果时,它会更容易。 ^_^【参考方案3】:

因为在 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()

【讨论】:

最佳答案和最低分。谢谢,你赢了。【参考方案4】:

对要复制的数组做slice(),然后排序。

var sortedWords_Array = words_Array.slice();

【讨论】:

以上是关于如何在排序之前保存数组的副本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在修改其副本时避免更新原始数组? [复制]

如何返回数组的副本? [复制]

如何在 Unity 中创建数组的独立副本?

如何制作一个快速的类对象数组的深层副本

如何将 InMemoryUploadedFile 对象复制到磁盘

ASP .NET - 在 GridView 中更新之前保存现有数据的副本