簡體   English   中英

即使使用 return 語句,帶有 forEach 的函數也返回 undefined

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM