我有一个大的多维数组,它包含对象的引用,我需要能够将引用从数组中的一个点移动到另一个点,然后删除原始引用(或将其设置为undefined)。这样做的问题是它会删除最近的引用。
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]
答案 0 :(得分:1)
是的,这只是delete
运算符执行它应该执行的操作,即删除[fromx,fromy]中引用的对象。尝试简单地将data[fromx][fromy]
设置为null
或未定义的变量(例如allYourBaseBelongToUs
(至少我希望它未定义)或者如果您无聊undefined
也未定义。
来源:
答案 1 :(得分: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"}]]
您的预期产量是多少?
答案 2 :(得分: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);
}
我不建议在这种情况下使用delete
,因为这不太可能是你真正想要的。如果您想保留“单元格”但删除其内容,只需为其指定undefined
即可。 delete
实际上删除了它。
有点偏离主题,但是:JavaScript没有多维数组。你有什么数组阵列。实际上有区别的区别在于,最外层阵列所拥有的数组可以具有不同的长度。 (此外,JavaScript数组稀疏 - 它们根本不是真正的数组,除非实现选择使它们如此 - 所以数组可以具有相同的长度但是间隙。)