什么是存储的值在位置的阵列,让我们说,[30] [1] [0] ...保存价值
我试过最快捷的方式var myArray[30][1][0] = new Date();
但事先不做var myArray = []; myArray[30] = []; myArray[30][1] = [];
不会起作用。
我在做什么错?
编辑:我的问题是,我不知道,首先,如果变量myArray已经存在,第二,如果已经有位置值,比如说[29] [2] [15],哪个我不想覆盖。
什么是存储的值在位置的阵列,让我们说,[30] [1] [0] ...保存价值
我试过最快捷的方式var myArray[30][1][0] = new Date();
但事先不做var myArray = []; myArray[30] = []; myArray[30][1] = [];
不会起作用。
我在做什么错?
编辑:我的问题是,我不知道,首先,如果变量myArray已经存在,第二,如果已经有位置值,比如说[29] [2] [15],哪个我不想覆盖。
正确的方法做你想做的是什么:
var array = [[[new Date()]]];
然而,由此产生多维数组不会有第二第三层面正好是30元和1,就像你在你原来有码。不知道这是否会对您造成问题。
当你这样做myArray[30][1][0]
,JavaScript是试图在阵列myArray
在访问元素30,但由于myArray
变量没有被初始化为任何事情,它具有价值undefined
。所以,你的代码是等效采用:
var myArray;
myArray[30] = new Date();
该代码将发出错误Cannot set property '30' of undefined
。
编辑: 如果你想确保数组分配值之前就存在,并避免重写现有的值,我能想到的最优雅的方式是:
// Store a value in the array, at index (posX, posY, posZ), only if
// that position in the array is currently empty
function storeDateNoOverride(theArray, posX, posY, posZ, date) {
var theArray = theArray || [];
theArray[posX] = theArray[posX] || [];
theArray[posX][posY] = theArray[posX][posY] || [];
theArray[posX][posY][posZ] = theArray[posX][posY][posZ] || date;
}
// If variable theArray doesn't have a value yet, assign it to a new array
var theArray = theArray || [];
storeDateNoOverride(theArray, 30, 1, 0, new Date());
不能初始化一个嵌套的对象像那。有两种方法。如果你事先知道你的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]);
非常感谢!会考虑! – Emilio
什么是存储在位置数组中的值,比方说最快捷的方式,[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);
或等效的适当pa rameterized时尚。
你可以做一个小帮手:
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)
非常感谢!会考虑! – Emilio
你为什么试图给一个多维数组赋值一个日期? –
简短回答:因为我在一个NodeJs后端管理数百个日期,需要将其作为JSON发送到前端,然后返回到NodeJS服务器。 – Emilio