Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Indexing - Fatal编程技术网

如何在JavaScript中实例化多维数组?

如何在JavaScript中实例化多维数组?,javascript,arrays,indexing,Javascript,Arrays,Indexing,简单地说,我需要做的是: var a = [[[]]]; a[1][2][3] = "hello!"; // [...[undefined,undefined,undefined,"hello!"]...]; a[1][2][1] = "a"; // [...[undefined,"a",undefined,"hello!"]...] a[2][3][4] = "new_index" // [...[undefined,"a",undefined,"hello!"]...[undefinedx

简单地说,我需要做的是:

var a = [[[]]]; 
a[1][2][3] = "hello!"; // [...[undefined,undefined,undefined,"hello!"]...];
a[1][2][1] = "a"; // [...[undefined,"a",undefined,"hello!"]...]
a[2][3][4] = "new_index" // [...[undefined,"a",undefined,"hello!"]...[undefinedx4, "new_index"]]
在我的例子中,我宁愿在指定索引之前不实例化数组的大小,并在需要较大索引时增加大小。
既然js不支持多维数组,那么在javascript中最简单或最干净的方法是什么

JS中的数组是引用类型,因此创建ND数组很棘手。克隆工具会非常方便。因此,你可以做如下事情

Array.prototype.clone=function(){
返回此.map(e=>Array.isArray(e)?e.clone():e);
};
函数arrayND(…n){
返回n.reduceRight((p,c)=>c=(新数组(c)).fill().map(e=>Array.isArray(p)→p.clone():p));
}
var arr=arrayND(2,3,4,“x”)
log(JSON.stringify(arr))以下是我的解决方案:

功能分配(输入){
if('object'!==输入类型){
设tmp={};
tmp[input]=参数[1];
输入=tmp;
}
设regex=/\.?([^.\[\]]+)\[(\d+)]/g;
让结果={};
for(让p输入){
让数据=结果,属性='',匹配;
while(match=regex.exec(p)){
数据=数据[prop]| |(数据[prop]=(匹配[2]?[]:{}));
道具=匹配[2]| |匹配[1];
}
数据[prop]=输入[p];
}
返回结果[“”];
}
//示例用法
设a=assign('3[4][5],'hello');
设b=assign('3[4][5][6],'world!');
让c=assign('you.can.use.object.as.well','cool!');
设d=assign('or.mix[3]。它们[2],'together!');
设e=assign({'with.multiple':'properties','in.a.single':'object'});
设f=assign({
[1][2][3]:“你好!”,
[1][2][1]:“a”,
[2][3][4]:"新"索引
});
log(a[3][4][5],'->',JSON.stringify(a));
log(b[3][4][5][6],'->',JSON.stringify(b));
log(c.you.can.use.object.as.well,'->',JSON.stringify(c));
log(d.or.mix[3].它们[2],'->',JSON.stringify(d));
log(e.with.multiple,'->',e.in.a.single,'->',JSON.stringify(e));
log('f[1][2][3]:',f[1][2][3]);
log('f[1][2][1]:',f[1][2][1]);

log('f[2][3][4]:',f[2][3][4])@Dragon Night我可能不太清楚。。。这一切都是关于初始化的。如果您想。。。关键是,一旦你创建了你的ND数组,你就可以在任何特定的索引上赋值,方法是执行
myArr[x][y]…[z]=“whatever”
问题是当我写arrayND(3,4,5,x)时,它会生成你提到的内容,但是对于另一个索引,我不能使用它。它覆盖上一个数组。当我增加索引或增加大小时,它也不起作用。每次重写。@Dragon Night当您使用
arr=arrayND(2,3,4,“x”)
创建一个数组时,您可以创建一个3D数组,就像一个由2个数组填充的数组,其中3个数组填充,每个数组填充4个项目一样(
“x”
)。当您喜欢
arr[1][2][3]=“test”
时,您将在主数组的第二个数组的第三个数组中分配第四项
“test”
。请试试。@Dragon Night好的。在JS中,关键是不能将项任意分配给不存在的对象。因此,如果
var a=[]
你不能
说a[0][0]=“随便什么”
你必须让它像
a[0]=[];a[0][0]=“无论什么”这就是为什么我们首先要初始化ND数组,而您可以随时扩展现有的2D数组,如
arr[x][y]=[];arr.[x][y][n]=“任意”
转换为3D。但是,如果不事先为扩展点分配数组,您就无法在运行中完成此操作。太好了,谢谢,我使用了arrayND([n])和回调函数,而不是像您一样使用箭头函数,而且它很有效。谢谢您的回答。我试图改进我的问题和例子。请看一下。@DragonKnight我更新了示例,向您展示了如何在用例中使用赋值函数。