2013-05-06 52 views
4

我只是做一个函数检查我的对象数组中的某些东西的值,但由于某种原因,它不断返回undefined。这是为什么?函数与forEach返回undefined即使返回语句

演示:http://jsfiddle.net/cNYwz/1/

var data = [{ 
    "Key": "1111-1111-1111", 
     "Email": "[email protected]" 
}, { 
    "Key": "2222-2222-2222", 
     "Email": "[email protected]" 
}]; 


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

因为你没有返回任何东西。 – 2013-05-06 05:30:20

+2

'getByKey'中的内部匿名函数没有返回'asd'。 – Jasen 2013-05-06 05:33:56

回答

10

在你的函数,你从传递给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的回调的第一个参数是数组的元素。

+0

你在15秒之前就到了这里,我必须为此赞扬你。 – 2013-05-06 05:35:43

1

尝试存储阳性结果作为一个变量,然后在功能年底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"; 
} 
+0

您已将参数的顺序反转为forEach。 – 2013-05-06 05:53:57

+0

这是从OP,对不起。 – 2013-05-06 05:56:19

1

您的函数getByKey没有返回语句。这两个返回值是forEach使用的匿名函数。

0

你不返回任何东西到外的范围,尝试这种另类:

function getByKey(key) {  
    var result = data.filter(function (i, val) { 
    return data[val].Key == key; 
    }); 
    return result.length ? result : 'Not found'; 
} 
0

除了想法其他的答案,你最好使用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],如果没有匹配,则会产生未定义的对象。