2010-09-25 51 views
0

我有一个很大的多维数组,保存对象的引用,我需要能够将引用从数组中的一个点移动到另一个点,然后删除原始引用(或将其设置为未定义)。问题在于它删除了最近的参考。Javascript References 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]; 
} 

编辑:我的意思是双方都没有了。 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'。 ;-) – 2010-09-25 13:29:01

+0

我发现使用流行/代码文化引用作为未定义的变量是多得多,但有趣。 – 2010-09-25 13:32:28

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数组是稀疏  —他们并不是真正的数组可言,除非选择使他们因此  —所以阵列可以具有相同的长度,但差距的实现。)