Javascript References Array - PullRequest
       3

Javascript References Array

0 голосов
/ 25 сентября 2010

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

var data = [[new Obj, new Obj], [new Obj, new Obj]];

function move(fromx, fromy, tox, toy) {
   data[tox][toy] = data[fromx][fromy];
   delete data[fromx][fromy];
}

Редактировать: Я имею в виду, что оба пропали.data[tox][toy] === undefined;Обе ссылки уничтожены, а не только data[fromx][fromy]

Ответы [ 3 ]

1 голос
/ 25 сентября 2010

Да, это просто оператор delete, который делает то, что должен, то есть удаляет объект, на который ссылаются в [fromx, fromy]. Попробуйте просто установить data[fromx][fromy] в null или неопределенную переменную, такую ​​как allYourBaseBelongToUs (по крайней мере, я надеюсь, что она неопределенная) или, если вам скучно, undefined также не определено.

Источники:

  1. https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/delete_Operator
  2. http://www.openjs.com/articles/delete.php
0 голосов
/ 25 сентября 2010

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; на самом деле они вообще не являются массивами, за исключением того, что реализация выбирает их так, чтобы массивы могли иметь одинаковую длину, но с пробелами.)

0 голосов
/ 25 сентября 2010
var x = [[{'a':'1'}, {'b':'1'}], [{'c':'1'}, {'d':'1'}]]
x[1][0] = x[0][0]
x[1][1] = x[0][1]
delete x[0][0]
delete x[0][1]

console.log(x)

отпечатков [[undefined, undefined], [Object { a="1"}, Object { b="1"}]]

Каков ваш ожидаемый результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...