Javascript 尝试创建多维数组时未定义的值

Javascript 尝试创建多维数组时未定义的值,javascript,Javascript,我正在尝试创建一个多维数组 我假设以下结构stuff['mykey1']['mykey2']['mykey3']可以解释为stuff是一个二维数组。而stuff['mykey1']将返回一个带有以下键的二维数组['mykey2']['mykey3'] 我尝试这样创建此结构: var stuff = null; if(stuff === null) { stuff = []; // stuff is [] } if(stuff[userId] === undefined) {

我正在尝试创建一个多维数组

我假设以下结构
stuff['mykey1']['mykey2']['mykey3']
可以解释为
stuff
是一个二维数组。而
stuff['mykey1']
将返回一个带有以下键的二维数组
['mykey2']['mykey3']

我尝试这样创建此结构:

var stuff = null;

if(stuff === null) 
{
    stuff = []; // stuff is []
}

if(stuff[userId] === undefined)
{
    stuff[userId] = [];  // stuff is [undefined, undefined, undefined, 888087 more...]
}

if(stuff[userId][objectId] === undefined)
{
    stuff[userId][objectId] = [];
} 
然而,当我一步一步看stuff数组时,我看到在
stuff[userId]=[]
之后;stuff数组是
[未定义,未定义,未定义,888087更多…]

我在等[888087,[]

未定义的值来自哪里

未定义的值来自哪里

您使用的是数组,而不是对象。如果在数组对象上添加数值属性,它的
长度
将被更新,其他索引保持单位化(),但显示为
未定义
(请参阅)

相反,使用普通对象,其中数值特性没有特殊行为:

var stuff = null;

if(stuff === null) 
{
    stuff = {}; // stuff is an empty object
}

if(stuff[userId] === undefined)
{
    stuff[userId] = {};  // stuff is now enriched with one property
}

if(stuff[userId][objectId] === undefined)
{
    stuff[userId][objectId] = {}; // or maybe you really want an array here?
}
未定义的值来自哪里

您使用的是数组,而不是对象。如果在数组对象上添加数值属性,它的
长度
将被更新,其他索引保持单位化(),但显示为
未定义
(请参阅)

相反,使用普通对象,其中数值特性没有特殊行为:

var stuff = null;

if(stuff === null) 
{
    stuff = {}; // stuff is an empty object
}

if(stuff[userId] === undefined)
{
    stuff[userId] = {};  // stuff is now enriched with one property
}

if(stuff[userId][objectId] === undefined)
{
    stuff[userId][objectId] = {}; // or maybe you really want an array here?
}

这是因为使用了数组。剩余元素的长度未定义。
例如,如果指定了(1),则由于使用了数组,(0)将未定义。剩余元素的长度未定义。
例如,如果指定了一个(1),那么一个(0)将是未定义的

您正试图创建的关联数组,在JavaScript中,这是通过。。。对象,而不是数组

因此,在每个步骤中,您都需要使用{}而不是[]来创建下一个级别。您需要使用for…in循环来迭代键

有关详细信息,请在Web上搜索JavaScript关联数组”。例如:


您正在尝试创建关联数组,在JavaScript中,这是通过…对象而不是数组完成的

因此,在每一步中,您都需要使用{}而不是[]来创建下一个级别,并且需要使用for…in循环来迭代键

有关更多详细信息,请在Web上搜索“JavaScript关联数组”。例如:


这个问题的答案很长,但我想插手一下这个速记,这确实使它更简洁易读:

stuff = stuff || {};

// if stuff is already defined, just leave it be. If not (||), define it as object

stuff[userId] = stuff[userId] || {};

// if stuff[userId] is already defined, define it as self (let it be unchanged). If not defined ( the || -signs ), define it as object.

stuff[userId][objectId] = stuff[userId][objectId] || {};

// and so on :)

这个问题的答案很长,但我想用这个速记,这真的让它更简洁易读:

stuff = stuff || {};

// if stuff is already defined, just leave it be. If not (||), define it as object

stuff[userId] = stuff[userId] || {};

// if stuff[userId] is already defined, define it as self (let it be unchanged). If not defined ( the || -signs ), define it as object.

stuff[userId][objectId] = stuff[userId][objectId] || {};

// and so on :)

你可能在某处做
数组(888087)
吗?当你做
stuff[888087]=[]
时,你是说
stuff
是一个长度至少为888088的数组。你确定这就是你想要的吗?你不想要对象而不是数组吗?@bfavaretto:是的,我忘了数组的自动大小。你可能在某处做
Array(888087)
吗?当你做
stuff[888087]=[]
时,你说
stuff
是一个长度至少为888088的数组。你确定这就是你想要的吗?你不想要对象而不是数组吗?@bfavaretto:是的,我忘了自动调整数组大小。