2016-06-23 7 views
-3
undefined

Ich habe eine Funktion wie diese, die funktioniert, aber ich verarbeiten das gesamte Array, bevor es zurückgibt:Rückkehr von angular.foreach ist

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; 
} 

Als ich diese (Rückkehr tun aus dem forEach Block, ich undefined, aber es sagt, dass der richtige Wert zurückgegeben.

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 
    } 
    }); 
} 

s Was hier ist der Deal? ist Winkel irgendwie einen seltsamen Rahmen zu schaffen, den weggeht?

+0

Ich denke, können Sie nicht wieder von 'forEach' wie' forEach' in JS & lodash/unterstreichen außer 'return false;' welche aus der Schleife brechen. – Tushar

+0

Sie benötigen ['Array # filter'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). – Tushar

+0

Vielleicht kann dieser mehr klären und Ihnen helfen http://stackoverflow.com/questions/13843972/angular-js-break-foreach –

Antwort

-1

Es scheint, dass er passiert, weil Sie einen Wert im forEach-Kontext zurückgeben, also gibt es etwas zurück, aber die foreach ignoriert es, weil es nichts zurückgibt (d. H. var return = angular.forEach... macht keinen Sinn mit forEach). Folglich gibt die Funktion undefined zurück (Sie haben keine Rückgabe der Funktion).

Scheint, dass Sie die Schleife forEach nicht brechen können, anstatt sie zu verwenden, können Sie das normale for verwenden und es brechen, wenn Sie den Wert finden, den Sie möchten.

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

Ist dies eine Antwort? Sie haben das Problem einfach neu formuliert. – mikeb

+0

Ich habe versucht, Ihnen das Problem zu erklären und den Unterschied zwischen der Rückkehr innerhalb oder außerhalb der 'forEach' – miquelarranz

+0

Richtig, und ich demonstrierte, dass durch die Veröffentlichung der 2 Versionen der Funktion – mikeb

0

In Ihrem zweiten Beispiel getDefault kehrt undefined da, dass der Standard behavour in JavaScript ist, wenn Sie nicht über eine return Aussage.

wäre dies deutlicher, wenn Sie Ihre verschachtelte Funktion in eine benannte Funktion trennen:

Übrigens
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 
} 

beide Versionen des Codes das gesamte Array verarbeiten wird. Um dies zu vermeiden, müssen Sie eine andere Art von Foreach verwenden; vielleicht nur das native JavaScript eines.

+0

Ich verstehe das nicht – mikeb

+0

ok, fair genug. Ich habe jetzt die innere Funktion hinzugefügt. Siehst du, wie mein Code derselbe ist wie deiner? Sie haben zwei Funktionen und ich habe zwei Funktionen. Sehen Sie, dass die Funktion getDefault keine return-Anweisung hat? –

1

preferences.every (function (Präferenz, index) {

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

});

return v