2010-09-25 3 views
0

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

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]; 
} 

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

ответ

1

Да, это всего лишь оператор 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
+2

Или, вы знаете ... 'undefined'. ;-) –

+0

Я нахожу использование ссылок на культуру поп/код, так как неопределенные переменные гораздо интереснее. –

0
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"}]]

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

0

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); 
} 

Live copy

Я бы не рекомендовал delete в этом сценарии, хотя, так как это очень маловероятно, что это то, что вы на самом деле хотите. Если вы хотите сохранить «ячейку», но удалить ее содержимое, просто назначьте ей undefined. delete фактически удаляет его.

Немного не по теме, но: JavaScript не имеет многомерных массивов. У вас есть массив массивов. Это различие, которое действительно имеет значение, поскольку массивы, находящиеся в самом внешнем массиве, могут иметь разную длину. (Кроме того, JavaScript массивы немногочисленны   — они на самом деле не массивы на всех, за исключением реализацию, выбирая, чтобы сделать их настолько   — поэтому массивы могут иметь одинаковую длину, но пробелы.)