【问题标题】:Javascript not returning in $.each()Javascript 未在 $.each() 中返回
【发布时间】:2015-11-21 14:24:21
【问题描述】:

我有这样的功能:

function contains(needle,haystack) {
    return $.each(haystack,function(i,v) {
        if(v == needle) {
            console.log('true, so return');
            return true;
        }
        if(typeof v == 'object') {
            return app.contains(needle,v);
        }
        console.log('I have not yet returned');
        return false;
    });
}

当我向其中传递一些东西时(比如说一个长度为 2 的对象,其中一个项目匹配),控制台显示:

true, so return
I have not yet returned
I have not yet returned

这是为什么?我该如何解决?

【问题讨论】:

标签: javascript jquery loops


【解决方案1】:

从每个回调返回 true/undefined 将继续执行下一次迭代。

您需要做的是使用一个标志,如果找到匹配项,则将该标志设置为 true 和 return false,以便忽略其余的迭代

function contains(needle, haystack) {
    var result = false;
    $.each(haystack, function (i, v) {
        if (v == needle) {
            console.log('true, so return');
            result = true;
            return false;
        }
        if (typeof v == 'object') {
            if (app.contains(needle, v)) {
                result = true;
                return false;
            }
        }
        console.log('I have not yet returned');
    });
    return result;
}

【讨论】:

  • 只要去掉$.each前面的return,把flag改成result就可以了。
  • 你的flag 在这里什么都不做。要打破循环,您需要返回 false(请参阅下面的答案)
  • @ArūnasSmaliukas 这是一个错字...假设是result = true;
【解决方案2】:

这是因为您只从每个 $.each 迭代的内部函数返回。

要打破$.each 循环,您需要return false,因此return !result 将返回false 当且仅当找到结果时

function contains(needle,haystack) {
    var result = false;

    $.each(haystack,function(i,v) {
        if(v == needle) {
            result = true;
            return !result;
        }
        if(typeof v == 'object') {
            result = contains(needle,v);
            return !result;
        }
    });

    return result;
}

http://jsfiddle.net/8dggq7ds/2/

或更短的版本

function contains(needle,haystack) {
    var result = false;

    $.each(haystack,function(i,v) {
        return !(result = (typeof v === 'object') ? contains(needle,v) : v == needle);
    });

    return result;
}

另外,递归调用app.contains()改为contains()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多