Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 排序前如何保存数组的副本?_Javascript_Arrays_Sorting - Fatal编程技术网

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]]