我只是创建一个函数来检查我的对象数组中的某个值,但由于某种原因它会一直返回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);
答案 0 :(得分:13)
在您的函数中,您将从传递给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的回调的第一个参数是数组的元素。
答案 1 :(得分:1)
尝试将肯定结果存储为变量,然后在之后的函数结尾处返回该变量(或“无法写入时无法找到”){{1循环。
forEach
答案 2 :(得分:1)
你的函数getByKey没有return语句。这两个返回值用于forEach使用的匿名函数。
答案 3 :(得分:0)
您没有向外部范围返回任何内容,请尝试以下方法:
function getByKey(key) {
var result = data.filter(function (i, val) {
return data[val].Key == key;
});
return result.length ? result : 'Not found';
}
答案 4 :(得分: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;
}
您也可以考虑使用filter,它可以返回一个只包含键匹配的对象的数组:
function filter_array_by_key(key){
return data.filter(function(v){
return v.Key===key;
};
}
要获取第一个匹配的对象,您可以使用filter_array_by_key(key)[0]
,如果没有匹配则会产生未定义。