将C#3D阵列移植到JS 3D阵列

时间:2016-09-05 07:24:39

标签: javascript c#

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

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

4 个答案:

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

因此,请指定widthheightdepth(这三个默认为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)