2016-09-22 131 views
0

什么是存储的值在位置的阵列,让我们说,[30] [1] [0] ...保存价值

我试过最快捷的方式var myArray[30][1][0] = new Date();但事先不做var myArray = []; myArray[30] = []; myArray[30][1] = [];不会起作用。

我在做什么错?

编辑:我的问题是,我不知道,首先,如果变量myArray已经存在,第二,如果已经有位置值,比如说[29] [2] [15],哪个我不想覆盖。

+0

你为什么试图给一个多维数组赋值一个日期? –

+0

简短回答:因为我在一个NodeJs后端管理数百个日期,需要将其作为JSON发送到前端,然后返回到NodeJS服务器。 – Emilio

回答

0

正确的方法做你想做的是什么:

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()); 
+0

不,这不是问题,但我的问题是,我不知道,首先,如果变量数组已经存在,其次,如果已经有一个位置的值,假设[29] [2] [15 ],我不想覆盖。 – Emilio

+0

@Emilio:请参阅我的编辑(添加示例代码,检查现有值) – AdrianT

+0

非常感谢!这真太了不起了! – Emilio

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

+0

非常感谢!会考虑! – Emilio

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

或等效的适当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) 
+0

非常感谢!会考虑! – Emilio