0

ここに何が問題なのかわかりませんが、ここに私のコードがあります

var btotal = [];
var songarray = [];
function whileplaying() {
    var playingSound = soundManager.getSoundById('aSound');
    for (var i=0;i<8;i++) {
        var ttotal = 0;
        for (var n=0;n<32;n++) {
            var eblock = (i*32)+n;
            ttotal = ttotal+(playingSound.eqData.left[eblock]*100);
        }
        ttotal = ttotal/32;
        btotal[i] = ttotal;
    }
    console.log(btotal);
    songarray.push(btotal);
}

説明すると、サウンドの再生中に、長さが8の配列が得られ、その周波数ブロックのEQ値が合計されます。最後に、この配列をsongarrayに追加します。したがって、songarrayは、サウンドのEQデータを配列に含む配列であるという理論があります。

問題は、songarrayの値を取得すると、予想どおりに多くの配列が含まれていることですが、それらはすべて同一であり、最後のデータポイントであるbtotalの最新の値です。

したがって、このコードが実行され、コンソールに次のように表示されます(たとえば)。

[42.743750000000006, 2.98125, 0.10625000000000001, 0, 0, 0, 0, 0]
[38.859374999999986, 2.8, 0.09375, 0, 0, 0, 0, 0]
[56.26874999999998, 21.831250000000004, 3.853125, 0.340625, 0, 0, 0, 0]
[46.459374999999994, 19.584374999999998, 1.4, 0, 0, 0, 0, 0]
[38.08125, 11.8, 1.0750000000000002, 0, 0, 0, 0, 0] 

ただし、曲の配列の内容は次のようになります。

0: Array[8]
0: 38.08125
1: 11.8
2: 1.0750000000000002
3: 0
4: 0
5: 0
6: 0
7: 0
length: 8
__proto__: Array[0]
1: Array[8]
0: 38.08125
1: 11.8
2: 1.0750000000000002
3: 0
4: 0
5: 0
6: 0
7: 0
length: 8
__proto__: Array[0]

これは、最新のbtotal配列のすべての内容です。これは、songarrayの各エントリが単にbtotalを指していると私に信じさせます。では、songarrayの各配列が、単なるポインターではなく、追加した時点のbtotalの値になるようにするにはどうすればよいでしょうか。

4

2 に答える 2

1

おそらく配列をコピーしたいと思うでしょう。

それ以外の

songarray.push(btotal);

使用する

songarray.push(btotal.slice(0));
于 2012-12-07T00:30:32.230 に答える
1

btotal関数のスコープ内で定義します。

var songarray = [];
function whileplaying() {
    var btotal = [];
    var playingSound = soundManager.getSoundById('aSound');
    for (var i=0;i<8;i++) {
        var ttotal = 0;
        for (var n=0;n<32;n++) {
            var eblock = (i*32)+n;
            ttotal = ttotal+(playingSound.eqData.left[eblock]*100);
        }
        ttotal = ttotal/32;
        btotal[i] = ttotal;
    }
    console.log(btotal);
    songarray.push(btotal);
}
于 2012-12-07T00:30:48.060 に答える