如何从上面的嵌套函数返回?

时间:2016-04-26 22:19:54

标签: javascript

以下函数将始终返回true,因为return false;返回传递给forEach的函数。

function exampleFunction(array){
    array.forEach(function(element){
        if(element.condition){
            return false; 
        }
    });
    return true;
}

现在,显然下面有效:

function exampleFunction(array){
    var result = true;
    array.forEach(function(element){
        if(element.condition){
            result = false; 
        }
    });
    return result;
}

但它并不理想,因为它会进行不必要的迭代。我知道我可以通过使用forEach的不同循环来解决问题,但我想知道是否有办法保留forEach。那么,我怎样才能从上面的'返回在嵌套函数中使用JavaScript函数吗?

3 个答案:

答案 0 :(得分:2)

除了抛出异常之外,在循环期间无法打破.forEach循环(但不要这样做)。如果您需要中途休息,请使用for循环。如果你真的需要方法或功能:

function forEach(arr, func) {
    for (var i = 0; i < arr.length; i++) {
        if (func(arr[i], i) === false) {
            break;
        }
    }
}

// Or...
Array.prototype.softLoop = function(func) {
    for (var i = 0; i < this.length; i++) {
    ...
}

var my_array = [0, 1, 2, 3];
my_array.softLoop(function(element, index) {
    console.log(index, element);
    if (element == 2) {
        return false;
    }
});

你甚至可以修改它,这样你就不需要在循环外面有一个标志:

Array.prototype.softLoopReturnable = function(func) {
    for (var ret, i = 0; i < this.length; i++) {
        ret = func(arr[i], i);
        if (ret === false) {
            break;
        }
    }
    return ret;
}

答案 1 :(得分:1)

您可以使用Array.prototype.some

function exampleFunction(array){
  return !array.some(function(element){
    return element.condition;
  });
}

在上面的代码中,exampleFunction会遇到false element,其中condition是真实的,true如果找不到,则{{1}}会返回{{1}}。

答案 2 :(得分:0)

您可以将function doesNotContainOnes(array){ return !array.some(function(el) { return el === 1; }); } document.body.innerHTML = doesNotContainOnes([5,9,6]) + '<br>' // true + doesNotContainOnes([5,9,6,'hi']) + '<br>' // true + doesNotContainOnes([5,9,6,1]) + '<br>'; // false by throwing an exception短路,但更好的方法是使用Array.prototype.some()

{{1}}