当前位置: 首页 > 知识库问答 >
问题:

javascript如果比较. flow()到数组不工作的最后一个值

干亮
2023-03-14

我有一个带有嵌套数组的数组。我遍历数组,并使用嵌套数组。shift()。当。shift()等于嵌套数组中的最后一个值,我在顶层迭代并使用console记录该值。日志(“数组的最后一个成员”)。如果活动shift()不是最后一个值,则我记录“数组成员”。

出于某种原因,我测试数组最后一个成员的if条件不起作用。奇怪的是,当我记录活动移位和数组的最终值时,日志显示它们是相同的!但if语句未运行。不确定这是否是因为我比较数组与对象或什么。有什么想法吗?

例如,在log中,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 = [
    ['.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)html" target="_blank">测试工作打印出“数组的最后一个成员”,即使它不是最后一个成员。。。我想这是因为这个。toString函数是相同的。

共有1个答案

狄子真
2023-03-14

您可以在自己的代码中找到问题的答案。

a3ls = a[3][ a[3].length-1 ].slice(); //make a copy of the last element of nested array before shift destructs the array

a3ls是实际元素的副本(slice总是返回一个新数组)。在itersub中,b是实际元素。Javascript==基于引用。它实际上并不检查两个数组是否包含相同的元素。它只检查这两个变量是否指向同一个对象,在本例中,它们不指向同一个对象。

你有两个选择。

  1. 实现一些外部逻辑,检查b的每个元素是否存在于a3ls中,反之亦然。

您可能还有第三个选择。不要使用shift。对循环使用一个简单的,并检查当前索引===长度-1

 类似资料:
  • 我在做一个简单的乐透游戏。如果我猜对了数字,我仍然会得到输掉的结果,除非它是我猜到的最后一个数字。如何将与输入的所有数字进行比较?

  • 我是java新手,我创建了两个arraylists,然后在while循环中向用户请求一个数字,一旦我从第1点和第2点获得了所需数量的数字。我将arrayllists转换为数组。我需要比较两个点阵,然后将最低点的缺失数字设置为零。例如 点1=(12,123,123,435,6756,667)//6个数字 点 2=(23,13,35)//3 个数字 点 3=(23,13,35,0,0,0)//新数组替

  • 我有一个简单的javascript问题,我真的需要一些帮助!我正在尝试弄清楚如何在数组之间比较元素,以及在下一个循环中再次比较较大的元素。假设我们有数组A和数组B。 我的问题是,在比较索引处的元素之后,我希望在下一个循环周期中比较较大的元素。 如果A=[5,7,4],B=[2,8,5] 在第一个循环中,5与2进行比较,2较小,因此会发生一些事情。在下一个循环周期中,我希望5与8进行比较,而对于现在

  • 本文向大家介绍JavaScript 数组比较,包括了JavaScript 数组比较的使用技巧和注意事项,需要的朋友参考一下 示例 为了进行简单的数组比较,您可以使用JSON stringify并比较输出字符串: 注意:这仅在两个对象都可以JSON序列化并且不包含循环引用的情况下起作用。可能会抛出TypeError: Converting circular structure to JSON 您可以

  • 我很好奇如何比较这些数组,请记住这是一个示例,它不限于 4 个数组,因为这可能或多或少取决于用户选择) 最终目标是根据上述所有数组的比较/验证,获得一个具有真值或假值的新数组,仅当所有 4 个数组在该索引位置都有一个真值时,才应设置一个真值,如果它们是否为假值,例如: 希望我解释得正确。

  • 问题内容: 我想比较两个数组…理想地,有效地比较。没有什么幻想,只要它们是相同的,如果不相同。毫不奇怪,比较运算符似乎不起作用。 每个数组都可以使用JSON编码,但是有没有一种更快或更“更好”的方法来简单地比较数组而不必遍历每个值? 问题答案: 要比较数组,请遍历它们并比较每个值: 比较数组: 用法: 您可能会说“ 但是比较字符串要快得多-没有循环… ”,那么,您应该注意存在ARE循环。第一个递归

  • 问题内容: 我有一份詹金斯工作,后来被克隆和修改。现在,我想比较两个作业的配置。不是历史更改,不是结果,而是两个作业的配置。 是否可以比较两个Jenkins作业的配置? 问题答案: 尝试: 要么

  • 'application.screenupdating=True Dim WbA As Workbook Set WbA=thisworkbook 在此输入图像描述