从angular.foreach返回是未定义的

时间:2016-06-23 10:58:23

标签: javascript angularjs

我有一个这样的函数可以工作,但我在返回之前处理整个数组:

function getDefault(name, preferences){
    console.log("Getting " + name);
    var v;
    angular.forEach(preferences, function(value, key){
    console.log("Checking " + value.name);
    if(value.name == name){
        v = value.value;
        console.log("Got match, value = " + v);
    }
    });
    console.log("v is " + v);
    return v;
}

当我这样做时(从forEach块内返回,我得到了未定义,但它表示返回了正确的值。

function getDefault(name, preferences){
    console.log("Getting " + name);
    var v;
    angular.forEach(preferences, function(value, key){
    console.log("Checking " + value.name);
    if(value.name == name){
        v = value.value;
        console.log("Got match, value = " + v);
        console.log("v is " + v);
        return v;  // The function returns but the value is undefined
    }
    });
}

取值 这里的交易是什么?角度是否会以某种方式创造一个消失的奇怪范围?

3 个答案:

答案 0 :(得分:1)

preferences.every(function(preference,index){

if (preference.value===name){
    v = preference.value;
    return false;
}
else return true;

});

return v

答案 1 :(得分:0)

在您的第二个示例getDefault中返回undefined,因为当您没有return语句时,这是JavaScript中的默认行为。

如果将嵌套函数分离为命名函数,这将更加明显:

function innerFunction(value, key){
    console.log("Checking " + value.name);
    if(value.name == name){
        v = value.value;
        console.log("Got match, value = " + v);
        console.log("v is " + v);
        return v;  // The function returns but the value is undefined
    }
}

function getDefault(name, preferences){
    console.log("Getting " + name);
    var v;
    angular.forEach(preferences, innerFunction);
    //getDefault does not return anything
}

顺便提一下,两个版本的代码都将处理整个数组。为了避免这种情况,你需要使用另一种foreach;也许只是原生的JavaScript。

答案 2 :(得分:-1)

似乎他正在发生,因为你在forEach上下文中返回一个值,所以它返回了一些东西,但是foreach忽略了它,因为它没有返回任何东西(即var return = angular.forEach...对{forEach没有意义1}})。因此,函数返回undefined(您没有返回函数)。

似乎你无法打破forEach循环而不是使用它,你可以使用普通的for并在找到你想要的值时将其中断。

for (key in preferences) {
    if(preferences[key].name == name){
        v = preferences[key].value;
        break;
    }
}