将C#3Darrays移植到JS 3Darrays

我开发了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(); 

这总是将数组对象保持在第一个位置,如果我设置其他任何我会丢失整个数组? 或者我错了

在撰写本文时,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); } 

试试这个 …

 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)); 

因此,指定widthheightdepth (这三个默认为1)和defaultValue (默认为零),您可以像操作任何javascript数组一样操纵它...

在javascript中,3D数组被创建为数组数组的数组:

 var 3DArr = [[[],[],[]],[[],[],[]],[[],[],[]]]; 

现在3DArr是一个包含数组的数组,每个数组也包含数组。 所以你可以做(​​例如):

 3DArr[0][1].push(10); console.log(3DArr); // [[[],[10],[]],[[],[],[]],[[],[],[]]] 

在较新的浏览器中,可以使用Array.from初始化数组数组:

 a = Array.from(Array(3), () => Array.from(Array(3), () => Array(3).fill(0))) console.log(JSON.stringify(a))