0

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

我假设以下结构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] = []; 东西数组是[undefined, undefined, undefined, 888087 more...]

我期待 [888087, []]

未定义的值从何而来?

4

4 回答 4

4

未定义的值从何而来?

您使用的是数组,而不是对象。如果您在 Array 对象上添加数值属性,length它将被更新并且其他索引保持统一化(稀疏数组),但显示为undefined(请参阅JavaScript 中的“未定义 x 1”是什么?)。

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

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?
}
于 2012-12-18T18:29:56.900 回答
0

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

所以在每一步你都需要使用 {} 而不是 [] 来创建下一个级别。而且您需要使用 for...in 循环来遍历键。

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

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects

于 2012-12-18T18:48:12.620 回答
0

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

于 2012-12-18T18:32:21.123 回答
0

这个问题已经得到了很长的回答,但我想用这个速记来补充一下,这确实使它更紧凑和可读:

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 :)
于 2015-09-16T20:09:15.900 回答