保持原始数组不变,更改函数中的本地副本

Keep original array intact, change local copy in function

本文关键字:函数 副本 原始 数组      更新时间:2023-09-26

即使我在函数内部进行克隆,嵌套数组也会发生更改。保存a阵列的最有效方法是什么?JSBin在这里。

var a = [[2,3],[1,5,2],[3,7,2]];
function c(a) {
  var l = a.slice(0);
  console.log('in func, before change',l);
  l[1].splice(1,1);
  console.log('in func, after change',l);
}
console.log('before call', a);
c(a);
console.log('after call',a);

您的代码在一维数组上运行良好:

function c(a) {
  var l = a.slice(0);
  console.log('in func, before change',l);
  l[1] = 17;
  console.log('in func, after change',l);
}
var a = [2,3,1,5,2,3,7,2];
console.log('before call', a);
c(a);
console.log('after call',a);

输出:

"通话前"[2,3,1,5,2,3,7,2]"在func中,更改前"[2,3,1,5,2,3,7,2]在func中,更改后[2,17,1,5,2,3,7,2]"通话后"[2,3,1,5,2,3,7,2]

事实上,这是一个2D阵列正在给你洗澡。查看这个关于克隆2D javascript数组的堆栈溢出响应:

使用javascript 克隆多维数组

现在使用这个代码:

Array.prototype.clone = function() {
    var arr = this.slice(0);
   for( var i = 0; i < this.length; i++ ) {
        if( this[i].clone ) {
            //recursion
            arr[i] = this[i].clone();
        }
    }
    return arr;
}
function c(a) {
  var l = a.clone();
  console.log('in func, before change',l);
  l[1].splice(1,1);
  console.log('in func, after change',l);
}
var a = [[2,3],[1,5,2],[3,7,2]];
console.log('before call', a);
c(a);
console.log('after call',a);

输出:

"通话前"[[2,3],[1,5,2],[3,7,2]]"在func中,更改前"[[2,3],[1,5,2],[3,7,2]]在func中,更改后[[2,3],[1,2],[3,7,2]]"通话后"[[2,3],[1,5,2],[3,7,2]]

.slice不执行"深度"复制。由于"a"的每个元素都是一个数组iteslf,因此"a"中的元素都是对那些内部匿名元素的引用。

数组"l"保存引用的副本,复制的引用仍然指向它们所引用的相同"对象"。