目标:编写一个函数,确定对象数组是否包含给定字段的给定值的对象。如果有这样的对象,则返回该对象,否则返回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
值。如果有人能解释错误,将不胜感激。
谢谢。
答案 0 :(得分:3)
更改
for(var i = 0; i <= arr.length; i++) {
到
for (var i = 0; i < arr.length; i++) {
使用<=
将超出数组的范围。
的 jsFiddle Demo 强> 的
答案 1 :(得分:0)
这是因为您应该将代码更改为for(var i=0; i < arr.length; i++){
:由于数组长度= arr.length,最后一个元素索引是arr.length - 1,因此您只需将arr [arr.length]作为空对象。< / p>