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;
};

上記のコードをGoogleChromeコンソールに入力しました。次の関数の呼び出しは機能します。

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'期待どおりに戻りますfalseif関数内の条件が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] を null オブジェクトとして取得しただけです。

于 2012-12-30T18:03:45.843 に答える