【问题标题】:jquery javascript stop an undefined object from being evaluated in nested array iterationjquery javascript停止在嵌套数组迭代中评估未定义的对象
【发布时间】:2012-11-06 14:58:10
【问题描述】:

我有一个数组数组,一些内部数组还有另一个嵌套数组。有些没有。我循环遍历顶级数组元素,如果有一个内部数组,我循环遍历它们。如果没有,我没有。或者我认为。

由于某种原因,当我的迭代发现一个没有嵌套数组的数组时,我的控制台显示“类型错误”未定义......这在技术上是正确的,因为没有定义嵌套数组。但是我认为我的嵌套 if 语句不允许对此进行评估。有什么想法吗?

例如,animation[0][3] 是一个数组,但 animations[1][3] 是未定义的。所以在我的 if 循环中我有一个嵌套的

var a = animations.shift();

if ( a[3] )
{
  console.log( 'a[3] is: ' + a[3] )
}
else
{
  return;
}

我认为,如果 a[3] 存在,则将其记录到控制台,如果不转义而不打印到控制台......但我的控制台继续产生未定义的评估。那是因为简单地测试它的存在会返回一个未定义的错误吗?每次遇到没有嵌套数组的数组时,如何阻止弹出此错误?

谢谢。

var animations = [
    ['.pcba','fadeIn', [1000], [
        ['.pcb_cad', 'fadeIn', [1000] ]
        ]
     ],
    ['.pcba', 'delay', [2000] ],
    ['.pcba','fadeOut', [1000], [
        ['.heatGenComps', 'fadeIn', [1000] ],
        ['.arrows', 'fadeIn', [1000] ]
        ]
    ],
    ['.heatGenComps', 'delay', [2000] ],
    ['.heatGenComps', 'fadeOut', [1000], [
        ['.arrows', 'fadeOut', [1000] ],
        ['.pcb_cad_cfd', 'fadeIn', [1000] ],
        ['.wePredOpTemps', 'fadeIn', [1000] ]
        ]
    ],

 ]; 

我像这样遍历它们:

iter();
function iter(){

if (!animating) return;

 var a = animations.shift();

if (a) {
     var el = a[0];
     var fn = a[1];
     var args = a[2];

     $.fn[ a[1] ].apply( $( a[0] ), a[2] ).promise().done(iter);
     if ( a[3] )
     {
        var secondary = a[3];
        console.log( 'a[3] is: ' + a[3] );
        secondaryAnime();
        function secondaryAnime(){
            b = secondary.shift();
            console.log('secondary is: ' + b );
            $.fn[ b[1] ].apply( $( b[0] ), b[2] );
            secondaryAnime();
         };

     }
     else
     {
        return;
     }


}
else
{

}

};

【问题讨论】:

  • if (typeof(a[3]) !== 'undefined') {
  • 错误仍然出现? 'if ( typeof(a[3]) !== 'undefined' )'
  • 这也不行...'if ( typeof( a[3] !== 'undefined' ) )'
  • 对我来说似乎工作得很好 -> FIDDLE ??

标签: javascript jquery undefined loops multidimensional-array


【解决方案1】:

实际上,您有很多用于简单动画链的代码。 您要做的就是在每个步骤中同时有一些动画。

您听说过plugin jquery-timing 吗?它允许连接几乎没有代码的任何异步内容。我将提供与您的动画链完全相同的完整代码,具有相同的时序,以 jquery-timing 样式编写:

$('.pcb_cad').fadeIn(1000)
    .$('.pcba').fadeIn(1000,$).wait(2000).fadeOut(1000)
    .$('.heatGenComps, .arrows').fadeIn(1000,$).wait(2000).fadeOut(1000)
    .$('.pcb_cad_cfd, .wePredOpTemps').fadeIn(1000);

如你所见,它只是一个长的 jQuery 链。

这里只需要该插件中的两种计时方法。 首先,只要您想在方法链中使用以下 jQuery 命令等待完成淡入淡出动画,您就可以编写 .fadeIn(...,$) 。 方法 .wait(timeout) 将在给定超时后继续方法链中的所有以下方法。

而且该插件有很多更直观的方式来推迟和连接您的操作。

【讨论】:

  • 一旦我有时间重构,我会试试那个插件;现有的解决方案目前有效。谢谢
【解决方案2】:

异常的原因是您如何迭代嵌套数组 b。停止获取时没有结束条件 secondary.shift();

在分配了 secondary.shift() 之后进行测试“if (b) { ... }”就可以了。

顺便说一句:您不需要编写所有空的“else”块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多