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 に答える
0

他の回答のアイデアに加えて、forEach ではなく Array.prototype.some を使用することをお勧めします。これにより、最初の一致が見つかったときに停止できます。

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 に答える