0

多次元配列を作成しようとしています。

次の構造は、2次元配列の配列stuff['mykey1']['mykey2']['mykey3']として解釈できるという私の仮定。stuffそしてstuff['mykey1']、次のキーを持つ2次元配列を返します['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 arrayを見ると、stuff[userId] = [];の後にそれがわかります。スタッフ配列は[undefined, undefined, undefined, 888087 more...]

[888087、[]]を期待しています

未定義の値はどこから来るのですか?

4

4 に答える 4

4

未定義の値はどこから来るのですか?

オブジェクトではなく、配列を使用しています。Arrayオブジェクトに数値プロパティを追加すると、そのプロパティはlength更新され、他のインデックスは単一化されたままになります(スパース配列)が、次のように表示されますundefinedJavaScriptの「undefinedx1」とは?を参照)。

代わりに、数値プロパティに特別な動作がない通常のオブジェクトを使用してください。

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

配列を使用しているためです。残りの要素の長さは未定義になります。たとえば、a(1)が指定されている場合、a(0)は未定義になります

于 2012-12-18T18:32:21.123 に答える
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

質問は長い間答えられていますが、私はこの速記を取り入れたいと思います。それは本当にそれをよりコンパクトで読みやすくします:

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 に答える