![](/img/trans.png)
[英]Recursive function returns undefined even with a valid return statement in javascript
[英]Function with forEach returns undefined even with return statement
我只是在創建一個函數來檢查我的對象數組中某個值的值,但由於某種原因,它一直返回undefined
。 這是為什么?
演示: http : //jsfiddle.net/cNYwz/1/
var data = [{
"Key": "1111-1111-1111",
"Email": "test@test.com"
}, {
"Key": "2222-2222-2222",
"Email": "test@boo.com"
}];
function getByKey(key) {
data.forEach(function (i, val) {
if (data[val].Key === key) {
return data[val].Key;
} else {
return "Couldn't find";
}
});
}
var asd = getByKey('1111-1111-1111');
console.log(asd);
在您的函數中,您從傳遞給forEach
的函數返回,而不是從getByKey
。
你可以這樣調整它:
function getByKey(key) {
var found = null;
data.forEach(function (val) {
if (val.Key === key) {
found = val;
}
});
return found;
}
但這會遍歷所有元素,即使該項目立即被找到。 這就是為什么你最好使用一個簡單的for
循環:
function getByKey(key) {
for (var i=0; i<data.length; i++) {
if (data[i].Key === key) {
return data[i];
}
}
}
請注意,我還修改了您的代碼以返回值,而不是鍵。 我想這就是意圖。 您可能還對另一個迭代函數感到困惑:傳遞給您給forEach的回調的第一個參數是數組的元素。
您的函數 getByKey 沒有 return 語句。 這兩個返回值用於 forEach 使用的匿名函數。
嘗試將肯定結果存儲為變量,然后在forEach
循環之后的函數末尾返回該變量(或“無法找到”,以防萬一沒有寫入)。
function getByKey(key) {
var result;
data.forEach(function (val, i) {
if (data[val].Key === key) {
result = data[val].Key;
}
});
return result || "Couldn't find";
}
您沒有將任何內容返回到外部范圍,請嘗試以下替代方法:
function getByKey(key) {
var result = data.filter(function (i, val) {
return data[val].Key == key;
});
return result.length ? result : 'Not found';
}
除了其他答案中的想法之外,最好使用 Array.prototype.some 而不是 forEach。 這會讓您在找到第一個匹配項時停止:
function getByKey(key) {
var found = null;
data.some(function (val) {
if (val.Key === key) {
found = val;
return true; //stop iterating
}
});
return found;
}
您也可以考慮使用過濾器,它可以返回一個只包含鍵匹配的對象的數組:
function filter_array_by_key(key){
return data.filter(function(v){
return v.Key===key;
};
}
要獲取第一個匹配對象,您可以使用filter_array_by_key(key)[0]
,如果沒有匹配,它將產生 undefined 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.