1

次のコードの目的は、次のような 2 次元配列を作成することです。

  • クリップはカスタム オブジェクトです
  • バンクは (8) 個のクリップの配列です
  • Banks は (8) バンクの配列です。
  • 各クリップは、bank[a][b] からアクセスできます。ここで、a はバンク (バンク) のインデックス、b はクリップ (クリップ) のインデックスです。

残念ながら、現在の状態では undefined が返されますが、その理由を説明するには途方に暮れています。私が間違っていることについての提案は大歓迎です

var banks = []

function Clip(a,b)

{
this.track = a
this.slot = b
}

function Bank(w)

{

for (var j, j = 0; j <= 7; j++) {
    var clips = []
    var aClip = new Clip(w,j);
    //post(i)
    //post(aClip.length)
    clips[j] = aClip
}
//post();
return clips
}

function makeBanks()

{

for (var k, k = 0; k <= 7; k++) {
    var aBank = Bank(k);
    //post(i)
    //post (aClip.length)
    banks[k] = aBank
}
}

makeBanks();

console.log(banks[0][0])​

よろしくお願いします

4

1 に答える 1

3

あなたの最大の間違いはここにあります ( 内Bank):

for (var j, j = 0; j <= 7; j++) {
    var clips = []
    var aClip = new Clip(w,j);
    //post(i)
    //post(aClip.length)
    clips[j] = aClip
}

clips保持される唯一の値が最後の値になるように、ループを介して毎回再初期化しています (ループは再度上書きする機会を得る前に終了するため)。説明のために、これは への最初の呼び出しから返されるものBankです:

[undefined, undefined, undefined, undefined, undefined, 
     undefined, undefined, Clip { track=0, slot=7}]

宣言をループの外に移動すると、この基本的な問題が解決されます。

var clips = [];
for (var j = 0; j <= 7; j++) {
    var aClip = new Clip(w, j);
    clips[j] = aClip;
}
return clips;

追加のクリーンアップ

基本的な問題を解決したので、これを解決するためにできることは他にもたくさんあります。

  • 一貫してセミコロンを使用する
  • コンストラクターとして使用する場合を除き、関数の名前の先頭を大文字にしないでください。
  • 一貫してインデントする
  • グローバル変数に依存しない
  • 宣言と代入を 1 ステップで行う (つまり、var j, j = 0である必要がありますvar j = 0)

結果:

function Clip(a, b) {
    this.track = a;
    this.slot = b;
}

function makeBank(w) {
    var clips = [];
    for (var j = 0; j <= 7; j++) {
        var aClip = new Clip(w, j);
        clips[j] = aClip;
    }
    return clips;
}

function makeBanks() {
    var banks = [];
    for (var k = 0; k <= 7; k++) {
        var aBank = makeBank(k);
        banks[k] = aBank;
    }
    return banks;
}

var banks = makeBanks();
console.log(banks[0][0]);
于 2012-07-07T06:49:15.503 に答える