我开发了一个ac#library,它使用了3个项目,在那个特定的代码片段中进行了中继,但是,我仍然需要在javascript中使用该代码,所以我把它移出去了,事情就是,我不会'我想我可以复制相同的逻辑,例如,我已经考虑了几天,我无法得到答案。
在C#库中我有一个3D数组,它有点像应用程序中的核心属性,我似乎无法弄清楚如何在JS环境中使用它。
例如我有这段代码:
public Obj[,,] objs = new Obj[18, 14, 8];
我将在每个单独的位置分配对象,并尝试将其移植到javascript,看起来会导致:
var 3dArr = new Array();
3dArr[0] = new Array();
3dArr[0][0] = new Array();
这总是将数组对象保持在第一个位置,如果我设置了其他什么,我会失去整个数组?或者我错了
答案 0 :(得分:2)
在撰写本文时,JavaScript中没有与C#中的多维数组非常相似的语言功能。也不建议将普通数组暴露给整个应用程序的使用,因为通过将数组写入不应该保留的内容,很容易错误地损害整个代码。
但是,将所需的数组封装到一个简单的新类中应该相对容易,例如:以下代码中的Array3d:
/***** CODE OF THE ARRAY *****/
function Array3d(width, height, depth, type) {
this.width = width;
this.height = height;
this.depth = depth;
this.type = type;
this.array = new Array(width * height * depth);
}
Array3d.prototype = {
get: function(x, y, z) {
return this.array[calcIndex(this, x, y, z)];
},
set: function(x, y, z, item) {
if (!(item instanceof this.type)) {
throw new Error(item + ' is not instance of ' + this.type + '.');
}
this.array[calcIndex(this, x, y, z)] = item;
}
};
function calcIndex(array3d, x, y, z) {
return x + array3d.width * y + array3d.width * array3d.height * z;
}
/***** USAGE CODE *****/
function Something(i) {
this.index = i;
}
var array3d = new Array3d(10, 11, 12, Something);
var something = new Something(11);
array3d.set(4, 0, 0, something);
var gettingBack = array3d.get(4, 0, 0);
if (gettingBack === something) {
console.log('1: Works as expected');
}
else {
console.error('1: Not expected ' + gettingBack);
}
gettingBack = array3d.get(0, 0, 4);
if (gettingBack == null) {
console.log('2: Works as expected');
}
else {
console.error('1: Not expected ' + gettingBack);
}
答案 1 :(得分:1)
试试这个......
Array3d = function (width, height, depth, defaultValue) {
width = width || 1;
height = height || 1;
depth = depth || 1;
defaultValue= defaultValue|| 0;
var arr = [];
for (var i = 0; i < width; i++) {
arr.push([]);
for (var j = 0; j < height; j++) {
var last = arr[arr.length - 1];
last.push([]);
for (var k = 0; k < depth; k++) {
last[last.length - 1].push(defaultValue);
}
}
}
return arr;
}
console.log(new Array3d(3, 5, 2, 0));
因此,请指定width
,height
,depth
(这三个默认为1)和defaultValue
(默认为零),您可以将其操作为你会有任何javascript数组...
答案 2 :(得分:1)
在javascript中,3D数组被创建为数组数组:
var 3DArr = [[[],[],[]],[[],[],[]],[[],[],[]]];
现在3DArr
是一个数组,里面有数组,每个数组也包含数组。所以你可以做(例如):
3DArr[0][1].push(10);
console.log(3DArr); // [[[],[10],[]],[[],[],[]],[[],[],[]]]
答案 3 :(得分:0)
在较新的浏览器中,可以使用Array.from
初始化数组数组:
a = Array.from(Array(3), () => Array.from(Array(3), () => Array(3).fill(0)))
console.log(JSON.stringify(a))
作为旁注,JavaScript“Array”更像是使用其整数键的特殊Dictionary
:
a = []
a['1'] = 2
a.b = 'c'
a[3.14] = Math.PI
console.log(a) // "[undefined, 2]"
console.log(a[1], a.b, a['3.14']) // "2 c 3.141592653589793"
因此您可以在初始化所有“维度”之前为其指定值:
function set(a, x, y, z, v) {
if(!a[x]) a[x] = []
if(!a[x][y]) a[x][y] = []
a[x][y][z] = v
}
a = []
set(a, 1, 2, 3, 4)
console.log(a)