【问题标题】:How to create empty 2d array in javascript?如何在javascript中创建空的二维数组?
【发布时间】:2013-05-06 21:42:16
【问题描述】:

如何在 Javascript 中创建一个空的二维数组(不知道新数组中有多少行或列)?

如果它是一个简单的数组var newArray = new Array();,我可以分配任意数量的元素。但是二维数组呢?我可以在不指定行数和列数的情况下创建一个吗?以及之后如何访问这些元素(myArray[0][1]myArray[0,1])?

【问题讨论】:

标签: javascript


【解决方案1】:

Javascript 中没有二维数组。

为了实现二维数组的效果,你使用数组的数组,也称为锯齿数组(因为内部数组可以有不同的长度)。

一个空的锯齿状数组就像任何其他空数组一样被创建:

var myArray = new Array();

你也可以使用空数组字面量:

var myArray = [];

要将任何项目放入交错数组中,首先必须将内部数组放入其中,例如:

myArray.push([]);
myArray[0][0] = 'hello';

您还可以创建一个数组,从头开始包含多个空数组:

var myArray = [[],[],[]];

这会给你一个没有任何项目的锯齿状数组,但它是由三个内部数组准备的。

由于它是一个数组数组,因此您可以使用 myArray[0][1] 访问这些项目。

【讨论】:

  • 谢谢,这很有帮助
  • 二维数组的简洁概念。
【解决方案2】:

是的,您可以创建一个空数组,然后将数据推送到其中。无需先在 JavaScript 中定义长度。
查看 jsFiddle Live Demo

定义:

var arr = [[],[]];

推送数据:

arr[0][2] = 'Hi Mr.A';
arr[1][3] = 'Hi Mr.B';

读取数据:

alert(arr[0][2]);
alert(arr[1][3]);


更新

这里也是Brady Dowling推荐的视频:
Create a 2D array

【讨论】:

  • 我们如何定义它然后new Array ()()
  • @meks 像这样:new Array([]),查看演示。答案解决了你的问题吗?
  • 对于数组的动态填充,请在此处查看 Guffa 的答案。
  • 不完全...不是。这仅有效,因为第一个索引会增加每个分配。如果您尝试 arr[7][7] = 'Hi Mr.C' 那么您会收到“无法设置属性”错误
【解决方案3】:
var myArray = [
    ["cats","dogs","monkeys","horses"],
    ["apples","oranges","pears","bananas"]
];
document.write(myArray[0][2]) //returns "monkeys"

【讨论】:

    【解决方案4】:

    你可以像这样创建一个 6 x 6 的空数组:

    var myGrid = [...Array(6)].map(e => Array(6));
    
    • Array(6) 生成一个长度为 6 且充满 undefined 值的数组。
    • 我们将该数组映射到另一个包含 undefined 值的数组。
    • 最后,我们得到一个 6x6 的网格,其中包含 undefined 位置。

    如果需要用默认值初始化网格:

    var value = 'foo'; // by default
    var myGrid = [...Array(6)].map(e => Array(6).fill(value));
    

    现在您有一个 6 x 6 的网格,其中包含 'foo'

    【讨论】:

    • 此处被低估的技巧 ^^^ 适用于任意二维数组。这是可重复使用的形式:const create2dArray = (rows, columns) => [...Array(rows).keys()].map(i => Array(columns))
    • 进一步的解释会很好;)
    • 使用[...Array(6)] 而不仅仅是Array(6) 有什么意义?
    • @nog642 您无法迭代 Array(6) 的结果数组,因为它没有元素,但 [...Array(6)] 的结果数组包含 6 个未定义的元素,您可以迭代/映射它们
    • 地图函数中不需要e。可以使用空括号:.map( () => Array(6).fill(value)
    【解决方案5】:

    两件事:

    1) 如果在 var myArray = [[],[]]; 之后调用,数组长度属性会错误地报告数组长度。陈述。从技术上讲,由于定义了空数组,它们被长度属性计算,但根据长度属性的精神,它确实应该返回 0,因为没有向任何数组添加非空元素。

    一个最小的解决方法是使用两个嵌套的 for(in) 循环,一个用于第一个数组,一个用于第二个数组,并计算未定义的元素。

    2) 扩展 Siamak A.Motlagh 示例并添加 arr([2][4]) = 'Hi Mr.C';分配失败并出现“未捕获的类型错误:无法设置未定义的属性 '4'”错误。

    查看 jsFiddle:http://jsfiddle.net/howardb1/zq8oL2ds/

    这是该代码的副本:

    var arr = [[],[]];
    
    alert( arr.length );  // wrong!
    
    var c = 0;
    for( var i in arr )
      for( var j in arr[ i ] )
        if( arr[ i ][ j ] != undefined )
          ++c;
    alert( c );  // correct
    
    arr[0][2] = 'Hi Mr.A';
    alert(arr[0][2]);
    
    arr[1][3] = 'Hi Mr.B';
    alert(arr[1][3]);
    
    arr[2][4] = 'Hi Mr.C';  // At this point I'm getting VM558:62 Uncaught TypeError: Cannot set property '4' of undefined
    alert(arr[2][4]);
    
    var c = 0;
    for( var i in arr )
      for( var j in arr[ i ] )
        if( arr[ i ][ j ] != undefined )
          ++c;
    alert( c );
    

    为什么第三次分配失败? [[],[]] 创建语句告诉它第一个数组对 0 和 1 有效,但对 2 无效,或者 2 和 3 对第二个数组有效,但对 4 无效?

    最重要的是,我将如何在 Array 中定义一个可以在第一个和第二个数组中保存日期对象的数组。我正在使用 jQuery-UI DatePicker,它需要一个日期数组,就像在日期对象中一样,我已经扩展为使用第二个日期数组来包含包含时间的日期对象,这样我就可以跟踪多个日期,并且每天多次。

    谢谢。

    【讨论】:

    • 第三次赋值为什么失败? [[],[]] 创建语句告诉它第一个数组对 0 和 1 有效,但对 2 无效,或者 2 和 3 对第二个数组有效,但对 4 无效?这是我的噩梦。
    【解决方案6】:

    假设您想制作一个 100x100 的二维数组(即矩阵),您可以在一行中完成,如下所示:

    var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));
    

    这将创建一个 100x100 的 NULL 矩阵。 将 100x100 替换为您想要的任何尺寸,将 null 替换为您喜欢的默认值,或为未定义的空白。

    【讨论】:

      【解决方案7】:

      这也可以用作表达式:

      var twoDarr= new Array(desiredLength);
      for (i=0;i<twoDarr.length;i++) {twoDarr[i]=[];} 
      

      我不知道它在性能方面如何与此处的其他答案相提并论,如果您有任何线索,请在 cmets 中告诉我。

      如果您事先不知道数组的长度,请记住,如果您想推送/删除/替换一个新元素来代替现有元素,您可以使用push([])splice() .

      【讨论】:

        【解决方案8】:
        const grid = new Array(n).fill(new Array(n))
        

        【讨论】:

        • 所有内部数组都有相同的引用。更改一个内部数组将更改所有其他内部数组。在大多数情况下,这不是所需的行为。
        【解决方案9】:

        我使用的函数

        function get_empty_2d_array(numRows, numColumnns) {
          return [...Array(numRows)].map(e => Array(numColumnns));
        }
        
        function get_2d_array_filled(numRows, numColumnns, fillValue) {
          return [...Array(numRows)].map(e => Array(numColumnns).fill(fillValue));
        }
        

        【讨论】:

        • 欢迎来到 Stack Overflow。没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何比 OP 提供的更好。见How to Answer
        【解决方案10】:

        您可以使用一个简单的 for 循环来创建一个近似大小的数组,然后根据需要推送更多行。

        const arr = [];
        const n = 7;
        const m = 5;
        
        for (let i = 0; i < n; i++) {
            arr.push(new Array(m).fill(0));
        }
        

        const arr = [];
        const n = 7;
        const m = 5;
        
        for (let i = 0; i < n; i++) {
            arr.push(new Array(m).fill(0));
        }
        
        console.log(arr);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-11
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          • 2013-11-22
          • 1970-01-01
          • 2015-01-13
          • 2020-04-21
          相关资源
          最近更新 更多