2014-10-09 4 views
4

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

a = { b: { c: 1, d: 2 }, d: {} } 
sub = a.b 
// sub is { c: 1, d: 2 } 

sub теперь на самом деле объект, хранящийся в, не клон.

Теперь, если я это сделать:

sub.c = "x" 
// a is now: { b: { c: 'x', d: 2 }, d: {} } // nice 

То же самое относится и к массивам.

Так что у меня этот массив:

arr = [{a: 1, b: 2}, {c: 3, d: 4}] 
sub = arr[1] 

я хотел бы, чтобы удалить sub из массива, так что arr становится: [{a: 1, b: 2}], но если я sub = null я просто присвоить новое значение sub. То же самое для delete.

delete sub // will unset the sub variable, not the object that it references. 

Таким образом, вопрос: как удалить {c: 3, d: 4} из массива с помощью sub

Даже если это работает, я не могу использовать delete arr[1], потому что я не знаю индекс. Я храню объект, используя функцию minlodash

+2

Вы не можете. 'arr [1]' и 'sub' являются ссылками на один и тот же объект, но' sub' не является указателем на массив. – Barmar

+0

Обратите внимание, что между 'sub.c =" x "и' sub = null' существует большая разница. В первом случае вы * читаете * значение 'sub' и мутируете объект, во втором вы * записываете * новое значение' sub'. –

ответ

3

Чтобы удалить элемент из массива, будь то примитивное значение или объект, вы все равно используете splice. Чтобы найти индекс элемента, вы должны использовать indexOf. Это возможно потому, что:

indexOf сравнивает searchElement с элементами массива с использованием строгого равенства (тот же метод, который используется оператором === или triple-equals, operator).

Так объединены

arr.splice(arr.indexOf(sub), 1); 

Взгляните на этой демонстрации:

var arr = [{a: 1, b: 2}, {c: 3, d: 4}] 
 
var sub = arr[1]; 
 

 
alert('Before: ' + JSON.stringify(arr)); 
 

 
arr.splice(arr.indexOf(sub), 1); 
 

 
alert('After: ' + JSON.stringify(arr));

2

Таким образом, вопрос: как удалить {c: 3, d: 4} из массив, используя sub

Невозможно сделать это напрямую.

Отношения в JavaScript в одну сторону.

sub - ссылка на объект. arr[1] - ссылка на тот же объект.

Нет прямого способа добраться от объекта до sub или до arr[1].

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

var index = arr.indexOf(sub); 

Затем вы можете использовать его для удаления элемента из массива.

arr.splice(index, 1);