【问题标题】: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 指的是同一个数组。将数组分配给变量不会创建它的副本。
  • 我想试试。谢谢
  • 好的。抱歉重复的问题,我没有找到它。只要他们允许,我就会投票正确。谢谢大家。

标签: javascript arrays sorting


【解决方案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();

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 2019-10-20
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2017-01-14
    • 2014-03-08
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多