Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中创建二维数组?_Javascript_Arrays_Multidimensional Array - Fatal编程技术网

如何在JavaScript中创建二维数组?

如何在JavaScript中创建二维数组?,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我一直在网上阅读,有些地方说这是不可能的,有些地方说这是可能的,然后给出一个例子,其他人反驳这个例子,等等 如何在JavaScript中声明二维数组?假设这是可能的 我如何访问其成员?myArray[0][1]或myArray[0,1] 可变项目=[ [1, 2], [3, 4], [5, 6] ]; console.logitems[0][0];//1. console.logitems[0][1];//2. console.logitems[1][0];//3. console.logit

我一直在网上阅读,有些地方说这是不可能的,有些地方说这是可能的,然后给出一个例子,其他人反驳这个例子,等等

如何在JavaScript中声明二维数组?假设这是可能的

我如何访问其成员?myArray[0][1]或myArray[0,1]

可变项目=[ [1, 2], [3, 4], [5, 6] ]; console.logitems[0][0];//1. console.logitems[0][1];//2. console.logitems[1][0];//3. console.logitems[1][1];//4.
console.logitems 二维数组的创建方式与一维数组相同。您可以像数组[0][1]一样访问它们


您只需将数组中的每个项设置为一个数组

var x=新阵列10; 对于var i=0;iconsole.logx Javascript只有一维数组,但正如其他人所指出的,您可以构建数组数组

以下函数可用于构造固定尺寸的二维数组:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

有人说这是不可能的,因为二维数组实际上只是数组的数组。这里的其他注释提供了在JavaScript中创建二维数组的完全有效的方法,但最纯粹的观点是,您有一个一维对象数组,每个对象都是由两个元素组成的一维数组


所以,这就是观点冲突的原因

与activa的答案类似,这里有一个创建n维数组的函数:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

我不确定是否有人回答了这个问题,但我发现这对我来说非常有效-

var array = [[,],[,]]
例如:


例如,对于二维数组

我必须制作一个灵活的数组函数,根据需要向其中添加记录,并能够在将记录发送到数据库进行进一步处理之前更新记录和执行所需的任何计算。以下是代码,希望对您有所帮助:

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}
请随意优化和/或指出任何错误:

最简单的方法:

var myArray = [[]];
var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

很少有人使用推送: 为了带来一些新的东西,我将向您展示如何使用一些值初始化矩阵,例如:0或空字符串。 提醒您,如果您有一个10元素数组,在javascript中,最后一个索引将是9

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}
最简单的方法:

var myArray = [[]];
var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

我发现以下是最简单的方法:

var array1=[[]]; 阵列1[0][100]=5; 警报1[0][100]; 1.长度; alertarray1[0]。长度 两个班轮:

var a = []; 
while(a.push([]) < 10);
它将生成一个长度为10的数组a,并填充数组。
Push向数组中添加一个元素并返回新的长度

要在javaScript中创建一个2D数组,我们可以先创建一个数组,然后添加数组作为它的元素。此方法将返回具有给定行数和列数的二维数组

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

Javascript不支持二维数组,相反,我们将一个数组存储在另一个数组中,并根据要访问的数组的位置从该数组中获取数据。请记住,数组计数从零开始

代码示例:


最明智的答案似乎是

var nrows=~~Math.random*10; var ncols=~~Math.random*10; log`rows:${nrows}`; log`cols:${ncols}`; var matrix=new Arraynrows.fill0.maprow=>new Arrayncols.fill0;
console.logmatrix 这是我找到的一种快速制作二维数组的方法

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}
您也可以轻松地将此函数转换为ES5函数

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}
工作原理:新的Arrayn构造函数创建一个原型为Array.prototype的对象,然后分配该对象的长度,从而生成一个未填充的数组。由于缺少实际成员,我们无法在其上运行Array.prototype.map函数

但是,当您向构造函数提供多个参数时,例如执行Array1、2、3、4时,构造函数将使用arguments对象来正确实例化和填充数组对象

出于这个原因,我们可以使用Array.applynull、Arrayx,因为apply函数会将参数分散到构造函数中。为了澄清,执行Array.applynull,Array3相当于执行Arraynull,null,null


现在我们已经创建了一个实际填充的数组,我们需要做的就是调用map并创建第二层y。

这就是我实现的:

var-appVar=[[]]; appVar[0][4]=bineesh; appVar[0][5]=kumar; console.logappVar[0][4]+appVar[0][5]; console.logappVar;使用数组理解 在JavaScript 1.7及更高版本中,可以使用数组理解来创建二维数组。您还可以在填充数组时过滤和/或操作条目,而不必使用循环

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/
您可以创建所需的任意nxm数组,并通过调用

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/
可以找到更多的示例和文档


请注意,这还不是一个标准功能。

我的方法与@Bineesh answer非常相似,但采用了更通用的方法

您可以声明双数组 y如下:

var myDoubleArray = [[]];
以及以以下方式存储和访问内容:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 
这将打印预期的输出

[ 9, 8 ] 9 123

一个用于创建填充有0的m*n二维数组的线条

new Array(m).fill(new Array(n).fill(0));
为一艘邮轮爱好者

另一个来自dmitry_romanov的评论使用

使用受InspiredJW启发的ES6+运营商:

var播放列表=[ [“我是按我的方式做的”,“Frank Sinatra”], [“尊敬”,“阿瑞莎·富兰克林”], [“想象”,“约翰·列侬”], [“生来就是为了跑步”,“布鲁斯·斯普林斯汀”], [“路易·路易”,“国王们”], ['Maybellene','Chuck Berry'] ]; 函数printmessage{ 文件。书面信息; } 函数打印歌曲{ var-listml; listHTML=; 对于变量i=0;i 我们正在使用,它可以采用类似param的数组和每个元素的可选映射

Array.fromarrayLike[,mapFn[,thisArg]]

var arr=Array.fromArray2,=>新阵列4; arr[0][0]=“foo”;
console.infoarr 要创建所有索引都可寻址且值设置为空的非稀疏二维数组x,y:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 
额外3D阵列x、y、z

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))
在对这个问题的回应中,在评论和不同的观点中都提到了这方面的变化和更正,但并不是作为一个实际的答案,所以我在这里添加了它

应该注意的是,与大多数其他答案类似,这具有Ox*y时间复杂性,因此可能不适用于非常大的数组。

只有在运行时才知道数组的行和列大小,然后可以使用以下方法创建动态2d数组

var num='123456'; 变量行=3;//在运行时已知 var col=2;//在运行时已知 var i=0; var array2D=[[]]; forvar r=0;rconsole.logarray2D[2][1];//6ES6+,ES2015+可以以更简单的方式实现这一点

创建3 x 2数组,其中填充true

[…Array3].mapitem=>Array2.filltrue 表演 今天是2020.02.05,我在MacOs HighSierra 10.13.6上为选定的解决方案在Chrome v79.0、Safari v13.0.4和Firefox v72.0上进行测试

非初始化2d阵列的结论

深奥的解决方案{}/arr[[i,j]]N对于大型和小型阵列都是最快的,看起来它是大型稀疏阵列的良好选择 基于for-[]/while A、G的解决方案速度快,是小型阵列的理想选择。 -[]B、C的解决方案速度快,是大型阵列的理想选择 基于数组的解决方案..map/from/fill I、J、K、L、M对于小数组非常慢,对于大数组非常快 令人惊讶的是,对于Arrayn B来说,C在safari上的速度比-[]A慢得多 出乎意料的是-[]在所有浏览器上,大型阵列的速度都很慢 解决方案K对于所有浏览器的小型阵列都很慢 解决方案A、E、G对于所有浏览器的大型阵列都很慢 解决方案M对于所有浏览器上的所有阵列都是最慢的 初始化2d阵列的结论

基于for/while A、B、C、D、E、G的解决方案对于所有浏览器上的小型阵列都是最快/相当快的 基于for A、B、C、E的解决方案对于所有浏览器上的大型阵列都是最快/相当快的 基于数组的解决方案..map/from/fill I、J、K、L、M对于所有浏览器上的小型数组都是中速或慢速的 用于大型阵列的解决方案F、G、H、I、J、K、L在chrome和safari上速度适中或较快,但在firefox上速度最慢。 深奥的解决方案{}/arr[[i,j]]N对于所有浏览器上的大小数组都是最慢的 细节 测试未填充初始化输出阵列的解决方案

我们测试解决方案的速度

小型阵列12个元素-您可以在您的机器上执行测试 大型阵列100万个元素阵列-您可以在您的机器上执行测试 函数Ar{ var-arr=[]; 对于var i=0;i1{ var args=Array.prototype.slice.callarguments,1; whilei-arr[length-1-i]=createArray.applythis,args; } 返回arr; } 返回createArrayr,c; } 函数Ir,c{ 返回[…Arrayr].mapx=>Arrayc; } 函数Jr,c{ 返回Arrayr.fill0.map=>Arrayc; } 函数Kr,c{ 返回Array.fromArrayr,=>Arrayc; } 函数Lr,c{ 返回Array.from{length:r}.mape=>Arrayc; } 函数Mr,c{ 返回Array.from{length:r},=>Array.from{length:c},=>{}; } 函数Nr,c{ 返回{} } // ------------------------ //展示 // ------------------------ log=t,f=>{ 设A=f3,4;//创建包含3行和4列的数组 [1][2]=6//2第3行第3列设置为6 console.log`${t}[1][2]:${A[1][2]},全文:${JSON.stringifyA.replace/null/g,'x'}`; } log2=t,f=>{ 设A=f3,4;//创建包含3行和4列的数组 [[1,2]]=6//2第3行第3列设置为6 console.log`${t}[1][2]:${A[[1,2]},全文:${JSON.stringifyA.replace/null/g,'x'}`; } log'A',A; 日志'B',B; log'C',C; 对数D',D; 对数‘E’,E; 对数'F',F; log'G',G; 对数'H',H; log'I',I; 对数'J',J; log'K',K; log'L',L; 对数M',M; log2'N',N;
这是解决方案的演示-不是基准要创建4x6阵列,只需执行此操作即可

const x = [...new Array(6)].map(elem => new Array(4))
通常,最好从空数组开始,而不是填充w个随机值。通常在1D中将数组声明为const x=[],所以最好在2D中以空w开头

Array(m).fill(v).map(() => Array(n).fill(v))
您可以创建一个初始值为m的二维数组mxn,n可以是任意数字,v可以是任意值字符串,数字,未定义



一种方法是var a=[m][n]

他们可以使用字符串之类的东西作为键和值吗?myArray['Book']['item1']?@Diego,是的,但这不是数组的用途。当您的键是字符串时,最好使用对象。我喜欢这个示例,而不是公认的答案,因为这可以用于动态大小的数组,例如,大小为变量的新数组大小。不起作用-赋值时出错。如果这个答案没有用,它怎么会得到280个喜欢呢?这是有效的,谢谢。您可以看到示例Gargo这是否可以创建一个4维数组?@trusktr:是的,您可以在内存限制内创建任意多个维度。只需输入四个维度的长度。例如,var array=createArray2,3,4,5;。最好的答案!但是,我不建议将其与0或1参数一起使用useless@BritishDeveloper这是一个5D数组,每个数组的长度为5:[[[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[null,null],[[null,null],[null,null],[null,null],[null,null]]]]]@haykam很抱歉浪费你的时间-我是在挖苦你:/不,不是。在某些语言中,可以使用多维数组,如string[3,5]=foo;。对于某些情况,这是一种更好的方法,因为Y轴实际上不是X轴的子轴。一旦它进入底层机器代码,所有维度大于1的张量都是数组的数组,不管我们讨论的是哪种语言。出于缓存优化的原因,值得记住这一点。任何适合数值计算的体面语言都将允许您在内存中对齐多维结构,以便将最常用的维度连续存储。我想到了Python的Numpy、Fortran和C。事实上,出于这个原因,在某些情况下,将维度简化为多个结构是值得的。计算机没有维度的概念。只有一个维度,内存地址。“其他一切都是为了程序员的利益而进行的符号装饰。”托马斯布朗并不完全如此。数组的数组需要一些存储空间来存储它们可能不同的内部数组的大小,并且需要另一个指针解引用以查找内部数组的存储位置。在任何像样的语言中,多维数组都不同于锯齿数组,因为它们本身就是不同的数据结构。令人困惑的是,C数组是多维的,即使它们是用[a][b]语法索引的。用这种方法初始化大型多维数组是很困难的。但是,可以用来创建一个空的多维数组,并将维度指定为参数。@AndersonGreen对于那些对多维数组解决方案感兴趣的人来说,您提到了一个链接是件好事,但是问题和Ballsacian1的答案是关于二维数组,而不是多维数组。您应该详细介绍整个过程。。。e、 g.警报项[0][1];//2等@SashikaXP,这不适用于除0以外的第一个索引。问题是如何声明二维数组。这就是我一直在寻找的,并且找到了这个和下面的答案,这些答案没有区分declare和initialize之间的区别。还有

具有已知长度或无界的声明,两者均未讨论。这是一个二维数组,请小心。分配myArray[0][whatever]可以,但尝试设置myArray[1][whatever]时,它会抱怨myArray[1]未定义。@Philip您必须设置myArray[1]=[];分配myArray[1][0]=5之前;请注意,这不会像@AndersonGreen所写的那样创建空的1x1数组。它创建一个1x0数组,即1行包含一个0列的数组。myArray.length==1和myArray[0]。length==0。如果你将一个真正空的0x0数组复制到它里面,那么它就会给出错误的结果。@182764125216这对我来说是当时的知识。谢谢:我怎样才能动态地做到这一点?我想要不同大小的内部阵列。您不需要额外的逗号var array=[[],[]就足够了。我想要制作一个代表一副牌的2-dim阵列。这将是一个2-dim的数组,保存卡值,然后放入套装中。最简单的方法是什么;i@Doug:您实际上需要一个具有2个属性的一维对象数组。var deck=[];deck[0]={face:1,suit:'H'}@DougHauf这是一个缩小的2D数组???:P:d请您在您的Answer中添加一些解释性信息,说明它是如何工作的,以及它解决问题的原因。这将帮助将来找到此页面的其他人。您何时需要一个在Javascript中预先初始化了一定数量列的数组?您可以访问第n个元素我注意到该函数以大写字母C开头,根据某些惯例,这意味着它将是一个函数构造函数,您可以将其与新关键字一起使用。这可能是一个非常小的、有点自以为是的词,但我仍然建议使用不大写的词。一行:对于var a=[];a.push[]@Bergi a变量还会在下一行定义吗?@Studencycat:是的,var就是这样工作的。它总是函数作用域。我知道,因此在这种情况下,你的一行是无用的:你不能访问它的成员检查问题Monukk和@Bergi,你都是对的。我试过了,我可以在for之后访问a。我道歉!谢谢,这对我来说可能是一个教训;假设有点迂腐的定义,在javascript中创建2d数组在技术上是不可能的。但您可以创建数组数组数组,这相当于相同的。仅供参考…当您使用var arr2D=new arrary5.fillnew Array3;用更多数组填充数组时,数组5的每个元素都将指向相同的Array3.所以最好使用for循环来动态填充子数组。a=Array5.fill0.mapx=>Array10.fill0换句话说,fill不会为要填充的数组的每个索引调用新的Array3,因为它不是lambda表达式或任何东西,比如上面龙飞吴的注释,它最初用0填充数组,然后使用map函数使用lambda用一个新数组填充每个元素。fill函数只是用你告诉它的内容填充数组。这有意义吗?有关map函数的更多信息,请参阅:@kalehmann这很好:如果新问题是一个更好的问题或有更好的答案,那么投票关闭旧问题作为新问题的副本。这应该位于最顶端。我使用Array.applynull和Arraynrows做了类似的操作,但这要优雅得多。关于我的最后一条评论……Internet Explorer和Opera不支持填充。这在大多数浏览器上都不起作用。@dimgl填充可以在这个实例中使用常量映射进行模拟:Arraynrows.map=>0或Arraynrows.map函数{返回0;};实际上,这将只创建两个数组。第二维度在每个索引中都将是相同的数组。是的,我确认了这一点。快速修复:a=Arraym.fill0.map=>Arrayn.fill0?map将取消引用并在每个插槽中创建唯一数组。请注意,您如何只能访问父数组的0索引。这不如允许您设置,例如,appVar[5][9]=10;…您将得到“无法设置未定义的属性9”。但是appVar[1][4]=bineesh;是错误的,如何解决它?我们可以在第一个fill函数中删除0:const arr2d=Array8.fill.map=>Array8.fill0;这里有一个快速的google检查…是的…for语句仍然是一个循环…任何浏览器都不支持它-?只支持aLine.push[clmn1,clmn2,clmn3];?我建议这样做:Array.from{length:5},=>[]这里有主观性,但第一个和第二个答案似乎是简洁、快速和现代的最佳平衡。@zurfyx有什么想法,或者有人知道webstorm为什么抱怨这个吗?似乎是array.from一直将值保留为未定义,然后我无法处理创建的数组,即使代码段在stacko上运行良好Verflow这是目前在JavaScriptBest one liner Response中创建大型空多维数组的最佳方法!请小心,因为fill设置了相同的值。如果将null更改为`object,则每个column@StanislavM
ayorov如果要设置每个单元格的值,只需使用相同的技巧:让2Darray=new Arrayx.fillnull.mapitem=>new Arrayy.fillnull.mapcell=>YourValueHerearay1[1][100]=666;抛出未捕获的TypeError:无法设置的属性“100”undefined@KamilKiełczewski您是对的,看起来这只是为数组的第一个数组初始化,在您执行数组1[1][100]=666之前为第二个数组初始化;,您需要执行此操作,数组1[1]=[];。我从您的过程中删除设置默认值的最后一个,并写入m=matrix3,4;m[1][2]=2;console.logJSON.stringifym;-我们得到了太多嵌套的strage矩阵-您在defaultValue的最后一步修复它,但我认为您可以在设置默认值之前重写过程以使用较少的嵌套数组。对于javascript世界,这是完美的解决方案。非常感谢你提供这个解决方案。你太好了,我必须承认。我采纳了您的答案并添加到了一行程序集合中。我喜欢您的答案,但您不需要使用map,您可以单独使用fill来完成,如下所示:var map=new arraywhight.fillnew Arraywidth.fillval;创建如下数组:map[y][x]=val;工作正常,但col和row不应该交换吗?您的可视化表示似乎违反了行为水平、列为垂直的惯例。
// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))
// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))
// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
Array.from(Array(2), () => new Array(4))
let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 
let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))
const x = [...new Array(6)].map(elem => new Array(4))
Array(m).fill(v).map(() => Array(n).fill(v))