ネストされた配列を含む配列があります。配列を反復処理し、.shift() を使用してネストされた配列を処理します。.shift() がネストされた配列の最後の値と等しい場合、トップレベルを反復処理し、それを console.log("配列の最後のメンバー") でログに記録しています。アクティブな shift() が最後の値でない場合、「配列のメンバー」をログに記録します。
何らかの理由で、配列の最後のメンバーをテストする if 条件が機能していません。奇妙な部分は、アクティブなシフトと配列の最終値をログに記録すると、ログはそれらが同じであることを示しています! まだ if ステートメントは実行されていません。これが配列とオブジェクトを比較しているためかどうかはわかりません。何か案は?
たとえば、ログの a3ls は b と同じです。これは、b = a3ls を意味しますが、その if ステートメントのブロックは実行されていません!
a3ls: .wePredOpTemps, .pcb_cad,fadeOut,1000
a is: .pcb_cad_cfd,fadeIn,1000,
b is: .wePredOpTemps, .pcb_cad,fadeOut,1000
a[3] is:
b member
if ステートメント if ( b == a3ls ) に従って、「b メンバー」は「最後のメンバー」であるべきだと思います。
animations は、切り捨てられたバージョンの大きな配列で、次のようになります。
animations = [
['.arrows', 'fadeIn', [1000], [
['.heatGenComps', 'fadeIn', [1000] ],
['.heatGenComps', 'delay', [2000] ],
['.heatGenComps, .arrows', 'fadeOut', [1000] ]
]
],
['.pcb_cad_cfd', 'fadeIn', [1000] , [
['.wePredOpTemps', 'fadeIn', [1000] ],
['.wePredOpTemps', 'delay', [2000] ],
['.wePredOpTemps, .pcb_cad', 'fadeOut', [1000] ]
]
],
]
ネストされた反復コード:
//iterate through nested array,
function iterSub( a, a3ls ){
b = a[3].shift(); //grab active of nested array
console.log('a3ls: ' + a3ls);
console.log('a is: ' + a );
console.log('b is: ' + b);
console.log('a[3] is: ' + a[3]);
if ( b )
{
animations.push(b); // add active value back to animations array for infinite loop
if ( b == a3ls ) //if active is last of array then
{
console.log("last member of b array");
//run animations with promise and done then call top level array iterations
$.fn[ b[1] ].apply( $( b[0] ), b[2] ).promise().done( function(){
iter();
});
}
else //more members left to iterate
{
console.log("b member");
//run animations and call sub with destructed array and the copy of the last value
$.fn[ b[1] ].apply( $( b[0] ), b[2] );
iterSub( a, a3ls );
}
}
else //no more elements left
{
console.log("b does not exists");
}
};
ネストされた配列がある場合にネストされた反復を呼び出す反復コード:
function iter(){
if (!animating) return;
a = animations.shift(); //active array
if (a) //if there is something, do something
{
console.log("a exists"); //log a
animations.push(a); //put a back to the bottom of array for infinite loop
if ( a[3] ) //if there is a nested array then
{
a3ls = a[3][ a[3].length-1 ].slice(); //make a copy of the last element of nested array before shift destructs the array
console.log("a[3] exists");
$.fn[ a[1] ].apply( $( a[0] ), a[2] ); //applied some jquery animations based on array parameters
iterSub( a, a3ls ); //call function to iterate through nested array and pass it the a array and a copy of the nested array's last value.
}
else //no nested array then do this
{
console.log("a[3] does not exist");
//use array to run jquery animations, promise, done, iterate to next
$.fn[ a[1] ].apply( $( a[0] ), a[2] ).promise().done( function(){
iter();
});
}
}
else //no a, nothing to do
{
return alert('a does not exist');
}
};
私がテストを行うときの編集if(b.toString == a3ls.toString)
は、最後のメンバーではない場合でも「配列の最後のメンバー」を出力します....toString関数が同じであるためだと思います。