在多维数组中存储值(Javascript)

时间:2016-09-22 21:51:16

标签: javascript arrays multidimensional-array

将数值存储在数组中的最快捷方式是什么,让我们说,[30] [1] [0] ......

我尝试了var myArray[30][1][0] = new Date();,但事先不做var myArray = []; myArray[30] = []; myArray[30][1] = [];就无法工作。

我做错了什么?

编辑:我的问题是,我不知道,首先,如果变量myArray已经存在,其次,如果已经有位置的值,那么,让我们说,[29 ] [2] [15],我不想覆盖。

3 个答案:

答案 0 :(得分:0)

正确的做法是:

var array = [[[new Date()]]];

但是,生成的多维数组在第三维上不会有30个元素,在第二维上不会有1个,就像在原始代码中一样。不确定这对你来说是不是一个问题。

执行myArray[30][1][0]时,JavaScript正在尝试访问数组myArray中的元素30,但是,由于myArray变量尚未初始化为任何内容,因此它的值为{{ 1}}。所以你的代码等同于:

undefined

此代码将发出错误var myArray; myArray[30] = new Date();

编辑: 如果你想在分配值之前确保数组存在并避免覆盖现有值,我能想到的最优雅的方法是:

Cannot set property '30' of undefined

答案 1 :(得分:0)

  

将数值存储在数组中的最快捷方式是什么,让我们说,[30] [1] [0] ......

经典的方式是

array[30] = array[30] || [];
array[30][1] = array[30][1] || [];
array[30][1][0] = array[30][1][0] || [];
array[30][1][0].push(value);

或以适当参数化方式的等价物。

你可以做一个小帮手:

function subarray(array, n) {
  return array[n] = array[n] || [];
}

然后你可以写

subarray(subarray(subarray(array, 30), 1), 0).push(value)

您也可以编写帮助程序,一次性完成所有访问和检查:

function getNestedElement(array, firstIndex, ...indices) {
  if (firstIndex === undefined) return array;
  return getNestedElement(array[firstIndex] = array[firstIndex] || [], ...indices);
}

然后写

getNestedElement(array, 30, 1, 0).push(value)

答案 2 :(得分:-1)

您不能像这样初始化嵌套对象。有两种方法。如果您事先知道您的ND阵列大小,则应首先将其实例化如下;

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};
function arrayND(...n){
  return n.reduceRight((p,c) => c = (new Array(c)).fill().map(e => Array.isArray(p) ? p.clone() : p ));
}

var arr = arrayND(5,5,5,void 0); // create 5x5x5 array and fill each cell with "undefined"
arr[3][2][1] = arr[3][2][1] || new Date(); // if falsey value then insert current date.
console.log(arr);

但是,如果您事先不知道多维尺寸并希望动态增加数组,则可以使用getNestedValue()setNestedValue()之类的函数。在这种特殊情况下,我将扩展Object.prototype。在生产代码中,这应该通过Object.defineProperty()工具完成。

Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};

Object.prototype.setNestedValue = function(...a) {
  a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
                                                                       : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
                                                                         this[a[0]].setNestedValue(...a.slice(1)))
               : this[a[0]] = a[1];
  return this;
};

var arr = [];
arr.getNestedValue(30,1,0) || arr.setNestedValue(30,1,0,new Date()); // if exists don't overwrite it;
console.log(arr[30][1][0]);