即使未显式修改数组值也已修改[重复]
Posted
技术标签:
【中文标题】即使未显式修改数组值也已修改[重复]【英文标题】:Array value modified even though it was not modified explicitly [duplicate] 【发布时间】:2018-01-15 05:44:16 【问题描述】:我编写了下面的代码,试图将一个元素添加到新数组的开头并返回该新数组。它工作正常,但是当我返回 arr 而不是 newArr 时,arr 也发生了变化。
function addToFrontOfNew(arr, element)
newArr = arr;
newArr.unshift(element);
return newArr;
如果我要写:
function addToFrontOfNew(arr, element)
newArr = arr;
newArr.unshift(element);
return arr;
并使用 addToFrontOfNew([1,2], 3) 测试函数,该函数将返回 [3, 1, 2]。
如何重写函数,使原来的 arr 不会随着 newArr 一起被修改?
【问题讨论】:
return [element].concat(arr)
这是因为在您的代码中 newArr
和 arr
都引用同一个数组。您没有克隆阵列。检查***.com/questions/3978492/…
【参考方案1】:
您应该克隆原始数组而不是引用它。一种方法是:
function addToFrontOfNew(arr, element)
newArr = arr.slice();
newArr.unshift(element);
return newArr;
slice() 方法返回一个浅拷贝...这里是详细信息https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array/slice
【讨论】:
【参考方案2】:function addToFrontOfNew(arr,element,rv)
var len = arr.length;
for(i=0; i<len; i++)
if (i==0)
newArr = [element,arr[0]];
else
newArr.push(arr[i]);
switch(rv)
case 'arr':
return arr;
break;
case 'newArr':
return newArr;
break;
var fruit = ['cherries','apples','pears'];
var newElement = 'bananas';
console.log(addToFrontOfNew(fruit,newElement,'arr'));
console.log(addToFrontOfNew(fruit,newElement,'newArr'));
** 修复了处理评论的代码 **
添加了一个 switch 语句,以便最终用户可以返回原始数组或新数组。基本上它计算原始数组,如果增量 = 0,则创建新数组,添加第一个元素,然后循环遍历数组的其余部分,将剩余元素按顺序推送到数组中。 switch 语句允许您返回原始数组或新数组。在控制台日志中工作,如果您使用 jQuery 将其输出到标签,只需将 .toString() 附加到函数的末尾即可。
【讨论】:
此代码不起作用。尝试使用console.log
而不是alert
,你会发现结果是错误的。 [arr.toString()]
并没有像你想象的那样做任何事情。
制作数组(浅)副本的正确方法是array.slice()
乔丹跑步 - 立即尝试。以上是关于即使未显式修改数组值也已修改[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Swift4.2~数组和字典(Array, Dictionary)基本类型转换