在引用变量中更改时,原始数组未更新

问题描述 投票:0回答:3

对于我的工作,我需要访问嵌套对象数组。我不想每次都使用完整路径进行访问。因此,我想通过将实际引用分配给变量来缩短引用。

我试图找出现有的答案,但没有得到这种情况的答案。

我做了什么:将数组的引用分配给变量,修改引用的值。但是原始数组没有被修改。

下面是我想要实现的演示代码。

let obj = {
    innerObj1: {
        arr: [2,3,4,5,6]
    }
}

var ref = obj.innerObj1.arr;
console.log(ref);
// output [2,3,4,5,6]

ref = ref.filter(n => n%2 == 0);
console.log(ref);
// output [2,4,6]

//Original obj
console.log(obj.innerObj1.arr)
// output [2,3,4,5,6]
javascript arrays pass-by-reference
3个回答
0
投票

这是因为filter方法返回一个新数组,并且您要用新值覆盖它。

如前所述,它创建了一个新数组,这意味着ref变量不再引用旧数组。它指的是通过filter方法创建的新数组。

您可以简单地使用for,while或do while循环来解决此问题。

我希望它能对您有所帮助。请在此处找到工作示例:

let obj = {
    innerObj1: {
        arr: [2,3,4,5,6]
    }
}

var ref = obj.innerObj1.arr;
console.log(ref);
// output [2,3,4,5,6]

for(let index=0; index < ref.length; index++) {
	if(ref[index] % 2 === 0) {
    ref[index] = ref[index]
  } else{
  	ref.splice(index,1);
  }
}
console.log(ref);
// output [2,4,6]

//Original obj
console.log(obj.innerObj1.arr)
// output [2,3,4,5,6]

0
投票

我们做的时候

var ref = obj.innerObj1.arr;

我们有一个指向obj.innerObj1.arr的指针当我们执行ref

时,ref.filter(n => n%2 == 0);是对数组的引用

获得我们想要做的事情

obj.innerObj1.arr = ref.filter(n => n%2 == 0);

0
投票

只需访问ref内的特定索引:

let obj = {
    innerObj1: {
        arr: [2, 3, 4, 5, 6]
    }
}

const ref = obj.innerObj1.arr;
console.log(ref);
// output [2, 3, 4, 5, 6]

for(let i = 0; i < ref.length; i++) {
  ref[i] = ref[i] % 2 == 0;
}

// Original obj
console.log(obj.innerObj1.arr)
// output [true, false, true, false, true]
© www.soinside.com 2019 - 2024. All rights reserved.