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

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


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

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

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

3DArr[0][1].push(10);
console.log(3DArr); // [[[],[10],[]],[[],[],[]],[[],[],[]]]
链接地址: http://www.djcxy.com/p/92997.html

上一篇: Porting C# 3D Array to JS 3D Array

下一篇: How to hide Soft Keyboard when activity starts