Почему .splice удаляет один и тот же элемент из другого массива объектов? [дубликат]Javascript

Форум по Javascript
Ответить
Anonymous
 Почему .splice удаляет один и тот же элемент из другого массива объектов? [дубликат]

Сообщение Anonymous »

У меня есть 2 переменные, в которых хранится объект, одно из свойств объекта является другим объектом (массивом).

Код: Выделить всё

const master = [
{key:"Apprentices", label:"Apprentices", children:[
{key:"1", label:"Linda"},
{key:"2", label:"George"}
]},
{key:"Electricians", label:"Electricians", children:[
{key:"3", label:"Kate"},
{key:"4", label:"Diane"}
]}
]
var elements = Array.from(master);
Я хочу удалить {key:"4", label:"Diane" из elements переменной (используя .splice), но когда я это делаю, он также удаляет его из главной переменной.
Интересно, если я удалю не дочернее свойство, например

Код: Выделить всё

{key:"Apprentices", label:"Apprentices", children:[
{key:"1", label:"Linda"},
{key:"2", label:"George"}
]}
он ​​не удаляет его из главной переменной, а только из elements переменной как и предполагалось.
В моем приложении я не могу использовать главную переменную в качестве CONST, к сожалению, но на jsplayground.dev я могу, но это не так. изменить ситуацию.

Здесь это мой полный код для удаления элемента из children свойства, который в конечном итоге удаляется из обеих переменных:

Код: Выделить всё

const master = [
{key:"Apprentices", label:"Apprentices", children:[
{key:"1", label:"Linda"},
{key:"2", label:"George"}
]},
{key:"Electricians", label:"Electricians", children:[
{key:"3", label:"Kate"},
{key:"4", label:"Diane"}
]}
]
var elements = Array.from(master);
var el = {'name': 3, 'label': 'Kate'}

console.log(elements)
console.log(master) // this is master variable not 'elements' variable

function addRemoveElement(el, addRemove, all) {
if (addRemove === 0) {
// remove
elements.forEach((item) => item.children.forEach((subItem, i) => {
if (subItem.label === el.label) {
item.children.splice(i, 1);
}
}));
}

console.log(elements)
console.log(master) // this is master variable not 'elements' variable
}

addRemoveElement(el, 0)
Вот мой полный код для удаления свойства верхнего уровня, которое правильно удаляет только одну переменную:

Код: Выделить всё

const master = [
{key:"Apprentices", label:"Apprentices", children:[
{key:"1", label:"Linda"},
{key:"2", label:"George"}
]},
{key:"Electricians", label:"Electricians", children:[
{key:"3", label:"Kate"},
{key:"4", label:"Diane"}
]}
]
var elements = Array.from(master);
var el = {'key': 'Apprentices', 'label': 'Apprentices'}

console.log(elements)
console.log(master) // this is master variable not 'elements' variable

function addRemoveElement(el, addRemove, all) {
if (addRemove === 0) {
// remove
elements.forEach((item, i) => {
if (item.label === el.label) {
elements.splice(i, 1);
}
});
}

console.log(elements)
console.log(master) // this is master variable not 'elements' variable
}

addRemoveElement(el, 0)
Журналы консоли для каждого:
1 — удаляет из обоих:

Код: Выделить всё

(2) [Object, Object]
0: Object
1: Object
key: "Electricians"
label: "Electricians"
children: (2) [Object, Object]

(2) [Object, Object]
0: Object
1: Object
key: "Electricians"
label: "Electricians"
children: (2) [Object, Object]

(2) [Object, Object]
0: Object
1: Object
key: "Electricians"
label: "Electricians"
children: (1) [Object]

(2) [Object, Object]
0: Object
1: Object
key: "Electricians"
label: "Electricians"
children: (1) [Object]
2 — корректно удаляет из одного

Код: Выделить всё

(2) [Object, Object]
0: Object
1: Object

(2) [Object, Object]
0: Object
1: Object

(1) [Object]
0: Object

(2) [Object, Object]
0: Object
1: Object
Я новичок в JavaScript, и раньше меня уязвляло, когда две переменные заполнялись из одного и того же источника, и если этот источник менял обе переменные, то же самое. Но в данном случае этого не должно произойти из-за Array.from() и CONST, но мой второй пример не удаляет оба.
Я действительно застрял в этом, поэтому буду очень признателен за любые рекомендации. Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ject-array
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»