即使未显式修改数组值也已修改[重复]

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) 这是因为在您的代码中 newArrarr 都引用同一个数组。您没有克隆阵列。检查***.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() 乔丹跑步 - 立即尝试。

以上是关于即使未显式修改数组值也已修改[重复]的主要内容,如果未能解决你的问题,请参考以下文章

树状数组区间修改和区间求和

未显式声明的 Vue 道具

List中为啥修改一个值其他值也变

Swift4.2~数组和字典(Array, Dictionary)基本类型转换

访问在 TF 2.0 中未显式公开为层的 Keras 模型的中间张量

面试题3:不修改数组找出重复的数字