将C#3D数组移植到JS 3D数组
我开发了一个用于跨3个项目的ac#库,该项目在特定代码段中进行中继,不过,我仍然需要在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));
因此,指定width
, height
, depth
(这三个默认为1)和defaultValue
(默认为零),您可以像处理任何javascript数组一样操作它。
在JavaScript中,3D数组被创建为数组数组:
var 3DArr = [[[],[],[]],[[],[],[]],[[],[],[]]];
现在3DArr
是一个内部有数组的数组,每个数组也包含数组。 所以你可以做(例如):
3DArr[0][1].push(10);
console.log(3DArr); // [[[],[10],[]],[[],[],[]],[[],[],[]]]
链接地址: http://www.djcxy.com/p/92997.html