Javascript 排序前如何保存数组的副本?
我正在尝试在排序之前保存数组的副本:Javascript 排序前如何保存数组的副本?,javascript,arrays,sorting,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_Ar
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\u数组进行排序之后,由于某种原因,它们都被排序了。为什么呢 使用该功能进行快速复制
另一方面-警报非常可怕。没有人希望单击一个JSFIDLE,只会看到一系列警报窗口。我已经将fiddle更新为include,这允许我们使用简洁的语法对HTML进行更新。对数组执行slice()
复制,然后排序
var sortedWords_Array = words_Array.slice();
因为在javascript中,数组是通过引用传递的,这意味着当您使一个数组等于另一个数组时,每当您对一个数组进行编辑时,它将同时更改这两个数组。要在示例中解决此问题,请更改以下行:
var sortedWords_Array = words_Array;
致:
有关其他用途和更深入的说明,请参见此处:
slice不改变原始数组,但返回一个新的“一级”
“深度”副本,其中包含从
原始数组
这不起作用,因为当您尝试分配
var-sortedWords\u数组=单词\u数组代码>
单词数组的引用被传递到sortedWords数组。因此,对sortedWords\u数组所做的任何更改都将反映在words\u数组上
由于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]的值更改为99。
jQuery的extend
方法在传递真值作为初始参数时执行深度复制:
var a =[[1], [2], [3]];
var b = $.extend(true, [], a);
b.shift().shift();
// a is still [[1], [2], [3]]
“这是为什么?”因为单词数组
和排序单词数组
指的是同一个数组。将数组赋给变量不会创建它的副本。明白了,我会试试看。谢谢你,好的。对于重复的问题,我没有找到它。他们一允许我,我就投正确票。谢谢大家。最好的答案和最低点。谢谢,这是你应得的。@Squirrl-你不需要接受我的回答,但请注意我对你的JSFIDLE中警报的评论。我相信,如果将来你能在我更新的小提琴中使用类似的格式,而不是使用提醒,大家都会很感激的。好的。我道歉。从现在起就可以了。再次感谢。@Squirrl-好的,太好了!首先感谢您发布JSFIDLE。这确实使您更容易正确地使用代码。当它不使用警报来显示结果时,这会更容易^_^谢谢这也是一个非常深刻的回答。如果我将来需要复制多维数组,我一定会看看它。谢谢。
var a =[[1], [2], [3]];
var b = $.extend(true, [], a);
b.shift().shift();
// a is still [[1], [2], [3]]