Исходный массив не обновляется при изменении в указанной переменной - PullRequest
0 голосов
/ 12 апреля 2020

Для моей работы мне нужен доступ к массиву вложенных объектов. Я не хочу получать к нему доступ каждый раз с полным путем. Поэтому я хотел сократить ссылку, назначив фактическую ссылку на переменную.

Я пытался найти существующие ответы, но не получил ответа для этого сценария.

Что я сделал: присвоил ссылку на массив переменной, изменил указанное значение. Но исходный массив не изменяется.

Ниже приведен демонстрационный код того, чего я хочу достичь.

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]

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

когда мы делаем

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 голосов
/ 12 апреля 2020

Это потому, что метод filter возвращает новый массив, и вы переопределяете его новым значением.

Как было сказано ранее, он создает новый массив, это означает, что переменная ref не ссылается на старый массив больше. Это относится к новому массиву, созданному методом filter.

Вы можете просто использовать для, пока или сделать, пока l oop, чтобы решить эту проблему.

Я надеюсь, что это поможет вы. Вы можете найти рабочий пример здесь:

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 голосов
/ 12 апреля 2020

Просто получите доступ к указанным c индексам в пределах 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]
...