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 - Fatal编程技术网

使用Javascript片段更新旧值

使用Javascript片段更新旧值,javascript,arrays,Javascript,Arrays,我试图编写一个函数,从多维数组(myArray)中选择一个随机条目,将其保存到一个新变量(myTempArray),并用id号(计数器)更新第一个条目 当我更改mytempArray[0][0][0]的值时,它也会更新myArray中的等效值。我不希望这些值改变 我该如何阻止这种情况发生?使用切片是错误的方法吗?如果是这样,如何复制原始数组条目,以便修改它并在其他地方使用?代码如下: var myArray = [ [[0, "Description 1", 0, 0, 1, 6, 0, 0,

我试图编写一个函数,从多维数组(myArray)中选择一个随机条目,将其保存到一个新变量(myTempArray),并用id号(计数器)更新第一个条目

当我更改mytempArray[0][0][0]的值时,它也会更新myArray中的等效值。我不希望这些值改变

我该如何阻止这种情况发生?使用切片是错误的方法吗?如果是这样,如何复制原始数组条目,以便修改它并在其他地方使用?代码如下:

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,这是有效的!