jQuery在嵌套的.each中跳过父循环的迭代

时间:2015-04-13 07:33:21

标签: jquery each parent

我有以下结构:

注意:此示例中的数组和目标只是符号!我知道这个例子会有更好的解决方案 - 它只是为了演示代码的构造。

var firstArray = [1,2,3,4,5];
var secondArray = [1,2,4,5];

$.each(firstArray,function(i,firstArrayElement){
    $.each(secondArray,function(i,secondArrayElement){
        if(firstArrayElement === secondArrayElement) {
            // do stuff

            // PROBLEM: force the firstArray loop to continue with the next iteration
        }
    });
    console.log("Didn't find: "+firstArrayElement);
});

jsFiddle

澄清我的问题:有没有办法强制父.each继续(=跳过console.log)下一次迭代?在PHP中,这将是continue 2;。因此,目标是,如果条件为真,则永远不会到达console.log()(在此示例中找到元素)。

the flag解决方案(jsFiddle),但必须有一个更好的方法来做到这一点。

还有solutions with labels但标签不适用于.each()。

所以我正在寻找的可能是在没有标志的父函数中使用return的方法。对于上面的示例,这意味着结果记录:Didn't find 3

4 个答案:

答案 0 :(得分:2)

所以,这有点hacky ......但它确实实现了在没有标志的情况下返回true函数的目标:

var firstArray = [1,2,3,4,5];
var secondArray = [1,2,4,5];

$.each(firstArray, function(i, firstArrayElement) {
    try
    {
        $.each(secondArray, function(i, secondArrayElement) {
            if (firstArrayElement === secondArrayElement) {
                throw 'Found';
            }
        });
    } catch(err) {
        return true;    
    }

    console.log("Didn't find: "+firstArrayElement);
});

答案 1 :(得分:2)

$.each方法的响应始终是迭代的对象。如果我们可以控制这个,就会有一个选择。我们不能,你将无法逃脱旗帜解决方案。

如果你打开放弃$.each,至少在内循环中,并使用for,这应该可以胜任:

var firstArray = [1, 2, 3, 4, 5],
    secondArray = [1, 2, 4, 5];

$.each(firstArray,function(i, firstArrayElement) {
    var x = null;

    for (var j = 0; j < secondArray.length; j++) {
        var secondArrayElement = secondArray[j];

        if (firstArrayElement === secondArrayElement) {
            console.log('Do stuff');
            // return false here if you wan't to break after the first match.

        } else if (j + 1 == secondArray.length) {
            return false;
        }
    }

    console.log('Didn\'t find: ' + firstArrayElement);
});

答案 2 :(得分:0)

编辑(就像其他人已经建议的那样):

$.each(firstArray,function(i,firstArrayElement){
         var idx = $.inArray(firstArray[i], secondArray);
            if(idx == -1) {
              console.log("Didn't find: "+firstArrayElement);   
            }
            else{
             //to do...
            }
        });

我不知道它是否适合您的问题...

答案 3 :(得分:0)

<强>解决方案:

在评论中找到解释。

$.each(firstArray,function(i,firstArrayElement){
    //Initialize skipParent at each Iteration
    var skipParent = false;
    $.each(secondArray,function(i,secondArrayElement){
        if(firstArrayElement === secondArrayElement) {
            // do stuff
            //set skipParent to true
            skipParent = true;
        }
    });
    //if skipParent true, we continue to next iteration.
    if(skipParent)
    {
        console.log("Didn't find: "+firstArrayElement);
        return false;
    }

});