0

目标:编写一个函数,确定对象数组是否包含具有给定字段的给定值的对象。如果存在这样的对象,则返回该对象,否则返回 false。

编码

var data = [
    {isle: 'VF', item: 'Ginger'},
    {isle: 'VF', item: 'Spinach'},
    {isle: 'Dairy', item: 'Milk'},
    {isle: 'Dairy', item: 'Yogurt'}
];

var objwithPropvalueInarr = function(propname, propvalue, arr){
    for(var i=0; i <= arr.length; i++){
        if (arr[i][propname] === propvalue) {
            // console.log('Found object with value ' + propvalue);
            return arr[i];
        }
    };
    return false;
};

我在 Google Chrome 控制台中输入了上述代码。以下对该函数的调用有效:

objwithPropvalueInarr('isle', 'VF', data)

上面的行data[0]按预期返回。

但是,以下调用返回一个 TypeError(显示在调用之后)

objwithPropvalueInarr('isle', 'nonexistentpropvalue', data)

TypeError: Cannot read property 'isle' of undefined
arguments: Array[2]
get message: function () { [native code] }
get stack: function () { [native code] }
set message: function () { [native code] }
set stack: function () { [native code] }
type: "non_object_property_load"
__proto__: Error

data[0]['isle'] === 'nonexistentpropvalue'false按预期返回。如果if函数中的条件不是false每次检查都返回,然后false在最后返回值。如果有人可以解释错误,将不胜感激。

谢谢你。

4

2 回答 2

3

改变

for(var i = 0; i <= arr.length; i++) {

for (var i = 0; i < arr.length; i++) {

使用<=将超出数组的范围。

jsFiddle 演示

于 2012-12-30T18:01:03.013 回答
0

这是因为您应该将代码更改为for(var i=0; i < arr.length; i++){:因为数组长度 = arr.length,最后一个元素索引是 arr.length - 1,所以您只需将 arr[arr.length] 作为空对象。

于 2012-12-30T18:03:45.843 回答