使用Javascript片段更新旧值
我试图编写一个函数,从多维数组(myArray)中选择一个随机条目,将其保存到一个新变量(myTempArray),并用id号(计数器)更新第一个条目 当我更改mytempArray[0][0][0]的值时,它也会更新myArray中的等效值。我不希望这些值改变 我该如何阻止这种情况发生?使用切片是错误的方法吗?如果是这样,如何复制原始数组条目,以便修改它并在其他地方使用?代码如下:使用Javascript片段更新旧值,javascript,arrays,Javascript,Arrays,我试图编写一个函数,从多维数组(myArray)中选择一个随机条目,将其保存到一个新变量(myTempArray),并用id号(计数器)更新第一个条目 当我更改mytempArray[0][0][0]的值时,它也会更新myArray中的等效值。我不希望这些值改变 我该如何阻止这种情况发生?使用切片是错误的方法吗?如果是这样,如何复制原始数组条目,以便修改它并在其他地方使用?代码如下: var myArray = [ [[0, "Description 1", 0, 0, 1, 6, 0, 0,
var myArray = [
[[0, "Description 1", 0, 0, 1, 6, 0, 0, 0, true, 0]],
[[0, "Description 2", 0, 0, 1, 6, 0, 0, 0, true, 0]],
[[0, "Description 3", 0, 0, 1, 6, 0, 0, 0, true, 0]],
];
function randomNumber (min, max) {
return Math.floor((Math.random() * max) + min);
};
counter = 1;
function myfunction(){
myrand = randomNumber(0,myArray.length-1);
mytempArray = myArray.slice(myrand,myrand+1);
mytempArray[0][0][0] = counter;
counter++;
};
myfunction();
请记住,
slice
仅在结构中的一个级别起作用。如果你想要一个深度拷贝,你必须自己实现
function myfunction() {
var myrand = randomNumber(0, myArray.length - 1);
var mytempArray = myArray.slice(myrand, myrand + 1); // <== Only copies one level
mytempArray[0] = mytempArray[0].slice(); // <== Copy the next
mytempArray[0][0] = mytempArray[0][0].slice(); // <== And the next
mytempArray[0][0][0] = counter;
// Presumably do something with `mytempArray` or return it
counter++;
}
函数myfunction(){
var myrand=随机数(0,myArray.length-1);
var mytempArray=myArray.slice(myrand,myrand+1);//数组是引用类型。slice
只进行浅层克隆,嵌套数组通过引用复制到新数组。在此处查看如何深层复制数组。除了Object.assign()
之外,您还可以使用…[]
spread运算符。@ThirueswaranRajagopalan:spread和rest都是语法,而不是运算符。@ThirueswaranRajagopalan…并且都不进行深度克隆。假设数据是有效的JSON,var deepCopy=JSON.parse(JSON.stringify(oldArray))
@JaredSmith:我坚信使用stringify
+parse
复制数据在多个层面上都是错误的。:-)好吧,通用的替代方法是递归复制数据结构。在JavaScript中,这意味着要么蹦床,要么保持显式堆栈以避免内存不足。或者您可以编写mi针对特定数据结构的数百万个一次性版本,包含所有可能的重复和错误。我不认为无论您以何种方式分割它都是“正确的”(双关语)。谢谢@t.J.Crowder,这是有效的!