17

我只是在创建一个函数来检查我的对象数组中某物的值,但由于某种原因它一直返回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);
4

5 回答 5

31

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

于 2013-05-06T05:33:48.013 回答
3

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

于 2013-05-06T05:34:16.443 回答
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";
}
于 2013-05-06T05:34:05.947 回答
1

您没有向外部范围返回任何内容,请尝试以下替代方法:

function getByKey(key) {    
  var result = data.filter(function (i, val) {
    return data[val].Key == key;
  });
  return result.length ? result : 'Not found';
}
于 2013-05-06T05:36:35.280 回答
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],如果没有匹配,它将产生 undefined 。

于 2013-05-06T06:00:50.743 回答