JavaScript - 控制二维动态数组

7
我想在JavaScript中初始化一个二维动态数组,它不限制元素(可能)像这样:
var dynamic = new Array ();
dynamic[] = new Array ();


我想把值添加到特定数组中,就像这样:

dynamic[id].push(2); // id = 3, dynamic[3][0] = 2
...
dynamic[id].push(3); // id = 3, dynamic[3][1] = 3
...
dynamic[id].push(5); // id = 5, dynamic[5][0] = 5

这是可能的吗?我该怎么做呢?谢谢。


如果您尝试访问“dynamic”上不存在的索引,您的意思是希望自动获取一个新的空数组吗? - Dogbert
你不能直接初始化一个二维数组。但是,你可以使用 push() 函数将数组元素添加到初始数组中,从而有效地使其成为二维数组。 - techfoobar
你想要一个二维数组吗? - me_digvijay
是的,谢谢 :) 就像 @Ingo Bürk 所做的那样 :) - DeLe
2个回答

5

您可以尝试这样做 (jsfiddle):

var dynamic = [];

dynamic.push = function (id, value) {
    if (!this[id]) {
        this[id] = [];
    }

    this[id].push(value);
}

dynamic.push(3, 2);
dynamic.push(3, 3);
dynamic.push(5, 5);

当然,这样做可以更好,但是它已经传达了重点。个人认为,我会为此编写一个类。
编辑:还要记住,这将创建一个可能具有大量未定义值的数组,在读取时需要处理。此外,像这样带有洞的数组性能很差(如果这是一个问题-对于少数甚至几百个值,它不重要)。

@Ingo Bürk +1,谢谢您的回答。您能否请发布一下如何从这个多维数组中检索值的方法?例如:我只需要id=3的值,如(3,2)和(3,3)。 - User Learning

0

重写 push 可能不是最佳方案。添加另一个方法/函数将使其更易于理解。某人阅读 push(1,3) 可能会认为您正在将 1 和 3 推入数组中,而不是将 3 推入第 1 项。

var dynamic = [];

dynamic.item = function(index) {
    if (!dynamic[index]) {
        dynamic[index] = [];
    }
    return dynamic[index];
}

这将允许您执行以下操作:

dynamic.item(1).push(1)

如果“item”不存在,则在返回它之前将创建它,这允许您在数组的两个维度上使用所有数组方法。(我相信)您还可以通过将其添加到Array原型中使其稍微更通用,这将允许您在所有数组上使用它。
Array.prototype.item = function(index) {
    if (!this[index]) {
        this[index] = init;
    }
    return this[index];
}

是的,就像我说的,有更好的方法。而且我仍然更喜欢使用类来实现。 :) - Ingo Bürk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接