【问题标题】:Javascript two dimensional arrays [duplicate]Javascript二维数组[重复]
【发布时间】:2013-01-08 17:35:55
【问题描述】:

我已经声明了一个二维数组,如下所示:

a = [[]]

但是,当我尝试使用 0 以外的第一个维度索引给出第二个维度值时,它不起作用:

a[1][0] = "foo" //returns error

有没有比手动将所需的每个索引定义为数组更好的方法,即:

a[1] = [];
a[2] = [];
a[3] = [];
//et cetera

【问题讨论】:

  • a[0][0] = x 应该可以工作。它返回什么错误?
  • a[0][0] = x 可以,但a[1][0] = x 不行。
  • 我的错,我指的是 0 以外的索引。让我更正一下。
  • Javascript 没有原生的二维数组。您必须使用包含数组的数组来模拟它们。对不起。
  • 不能使用 json 结构吗?严格来说是javascript吗?

标签: javascript arrays multidimensional-array


【解决方案1】:

javascript 中不存在 N 维数组 - 您只需制作包含数组作为元素的数组。

您收到错误是因为a = [[]]; 声明了一个带有 one 元素的数组,而该数组恰好也是一个数组。因此a[0] 是内部数组,但a[1] 不存在,因为您从未声明它。正确声明“二维数组”的最简单方法是使用循环:

var outerArray = [];
var numInternalArrays = 5;
for (var i = 0; i < numInternalArrays; i++) {
    outerArray[i] = [];
}

【讨论】:

    【解决方案2】:

    如果你知道根数组应该有多少个元素,你可以这样做:

    var arr = 
        (Math.pow(2,10)-1).toString(2)  // Binary string of 1s. Its length being 10
        .split('')                      // Create an array from this string
        .map(function(){return [];});   // Map a new empty array to each index
    
    console.log(arr);                   // [[],[],[],[],[],[],[],[],[],[]]
    

    这完成了同样的事情:

    for(var arr = [], i=10; i--; arr[i]=[]);
    

    由于javascript没有块作用域,因此无需在for循环之外声明arr,它将被添加到执行它的作用域中。

    【讨论】:

    • 这是有史以来最好的答案,在阅读本文之前我不了解 JavaScript 而不是我了解。我曾经是一个不尊重长辈的可怜人,现在我找到了那种尊重。谢谢你 Shmiddty,谢谢你改变了我的生活!你的行为不会被忽视!
    • 您是否也可以使用 jQuery 提供答案?我听说它真的很好并且更好地解决了这些问题。
    • 阅读此答案后,我的生活清晰十倍。
    • 这个答案治愈了我的SPD,谢谢你给我第二次改变Shmiddty,我不会浪费的!真的很鼓舞人心。
    【解决方案3】:
    a = [[]]
    

    这是一个数组,第一项是数组。这就是为什么索引到第一项仍然有效(a[0][0])。

    如果您想以数组的形式访问第二项,则需要将数组创建为

    a = [[],[]]
    

    有关以下示例,请参阅此问题 How can I create a two dimensional array in JavaScript?

    【讨论】:

      【解决方案4】:

      如果我理解正确,请使用循环:

      for (var i = y; i--; a[i] = []);
      

      【讨论】:

      • 我又不好了:我的意思是说是否有其他方法可以解决它,而不是以任何方式定义所有它们。我想知道 JS 中是否有一个魔术可以为你做到这一点。
      • @Bluefire 我仍然不完全了解您要做什么。我的回答没有帮助吗?
      • 确实如此,我只是想知道是否有一个本机函数可以解决问题。
      • @Bluefire 不,没有。一旦你添加了这行代码,你就可以在没有错误的情况下执行a[1][0] = "foo"
      • @David 你也可以在循环中声明a,尽管它可能不太可读。
      【解决方案5】:

      javascript 中没有多维数组。
      您正在做的是一个数组数组,但最外面的数组只有一个元素(即元素 0),其值是另一个数组。所以 a[1](或更一般地说是 a[1][x])是无效的,因为最外面的数组只有一个元素。
      所以你可以做 a[0][x] = "foo" 但不能反过来。

      因此,您可以使用 for 循环初始化数组或执行类似 var a =[[][][][][]];

      【讨论】:

        【解决方案6】:

        您可以让数组的数组以如下方式开始:

        var a = []; // start with the column array
        

        然后,当您想在位置 [i][j] 中放置某些东西时,我们可以将“i”称为行索引,将“j”称为列索引。

        if (!a[i]) {   // check for row existing
            a[i] = []; // .. and create it if not 
        }
        a[i][j] = 'foo'; // put something in the array cell
        

        请注意,这只是因为我们总是在创建新行数组后立即将其放入新行数组中。如果你把 0 或 "" 放在那里而不是 'foo',它可能不起作用。

        javascript中有很多“假”的东西,包括“null”、“undefined”和“0”,我只是不知道是一个空数组还是一个包含一个空字符串元素的数组被认为是假的。因此,您必须做一些实验,以准确检测缺失的行数组,以便将其添加进去。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-27
          • 2014-12-14
          • 2017-09-20
          • 2014-04-30
          • 2019-06-23
          • 2020-12-23
          • 1970-01-01
          • 2010-09-16
          相关资源
          最近更新 更多