将数值存储在数组中的最快捷方式是什么,让我们说,[30] [1] [0] ......
我尝试了var myArray[30][1][0] = new Date();
,但事先不做var myArray = []; myArray[30] = []; myArray[30][1] = [];
就无法工作。
我做错了什么?
编辑:我的问题是,我不知道,首先,如果变量myArray已经存在,其次,如果已经有位置的值,那么,让我们说,[29 ] [2] [15],我不想覆盖。
答案 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]);