delete
не удаляет объект, он удаляет свойство, которое ссылалось на объект. В вашей функции move
, поскольку вы только что присвоили этот объект другому свойству, у вас все еще есть этот объект. (Что бы ни было ранее в этом слоте в массиве, это тост.)
Ваш приведенный выше пример в основном работает, вот пример (с использованием пользовательского объекта, чтобы мы могли легко распечатать содержимое массивов):
function T(id) {
this.id = id;
}
T.prototype.toString = function() {
return this.id;
};
var data = [[new T("0x0"), new T("0x1")],
[new T("1x0"), new T("1x1")]];
display("0: " + data[0].join(","));
display("1: " + data[1].join(","));
display("Moving 0x0 to 1x2");
move(0, 0, 1, 2);
display("0: " + data[0].join(","));
display("1: " + data[1].join(","));
function move(fromx, fromy, tox, toy) {
data[tox][toy] = data[fromx][fromy];
delete data[fromx][fromy];
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
Живая копия
Я бы не рекомендовал delete
в этом сценарии, так как очень маловероятно, что вы на самом деле хотите. Если вы хотите сохранить ячейку, но удалить ее содержимое, просто присвойте ей undefined
. delete
фактически удаляет его.
Несколько не по теме, но: JavaScript не имеет многомерных массивов. То, что у вас есть, это массив массивов. Это различие, которое на самом деле имеет разницу в том, что массивы, содержащиеся в самом внешнем массиве, могут иметь разную длину. (Кроме того, массивы JavaScript редки & mdash; на самом деле они вообще не являются массивами, за исключением того, что реализация выбирает их так, чтобы массивы могли иметь одинаковую длину, но с пробелами.)