6

リンク: http://jsfiddle.net/ewBGt/

var test = [{
    "name": "John Doo"
}, {
    "name": "Foo Bar"
}]

var find = 'John Doo'

console.log(test.indexOf(find)) // output: -1
console.log(test[find]) // output: undefined

$.each(test, function(index, object) {
    if(test[index].name === find)
        console.log(test[index]) // problem: this way is slow
})

問題

上記の例では、オブジェクトを含む配列があります。持っているオブジェクトを見つける必要がありますname = 'John Doo'

私の.eachループは機能していますが、この部分は 100 回実行され、テストにはさらに多くのオブジェクトが含まれます。なので、この方法は遅くなると思います。

indexOf()オブジェクトで名前を検索できないため、機能しません。

質問

name = 'John Doo'現在の配列でオブジェクトを検索するにはどうすればよいですか?

4

5 に答える 5

7

jQuery $.grep(またはその他のフィルタリング機能) は最適なソリューションではありません。

検索されたオブジェクトがループ中に既に見つかった場合でも、$.grep関数は配列のすべての要素をループします。

jQuery grep ドキュメントから:

$.grep() メソッドは、必要に応じて配列からアイテムを削除し、残りのすべてのアイテムが提供されたテストに合格するようにします。テストは、配列アイテムと配列内のアイテムのインデックスが渡される関数です。テストが true を返した場合にのみ、項目が結果配列に含まれます。

配列がソートされていない場合、これに勝るものはありません。

var getObjectByName = function(name, array) {

    // (!) Cache the array length in a variable
    for (var i = 0, len = test.length; i < len; i++) {

        if (test[i].name === name)
            return test[i]; // Return as soon as the object is found

    }

    return null; // The searched object was not found

}
于 2013-04-02T14:53:36.860 に答える
7

この種の状況で「検索可能なマップオブジェクト」を実行したことがあります。配列自体が静的である場合は、配列値をキーにして値インデックスをマップできるマップに変換できます。あなたの例のように、値は一意であると想定しています。

Lo-Dash (www.lodash.com ) には、ループなどを簡単に行うためのさまざまなユーティリティが用意されています。チェックしてみてください。

注:しかし、多くの場合、100 要素の配列をループすることについて心配する必要はありません。

于 2013-04-02T14:27:25.453 に答える
3

値がそこにあるかどうかを知りたい場合は、次のincludesように lodash の関数を使用できます。

var find = 'John Doo'

[{ "name": "John Doo" }, { "name": "Foo Bar" }].some(function (hash) {
    if (_.includes(hash, find)) return true;
});

ドキュメンテーション:

于 2014-08-27T18:52:01.617 に答える
0

可能な唯一のことは、自分でループを実行するよりも組み込みの配列メソッド (利用可能な場合) を使用することfilterです。メソッドはここで適用できます。

しかし、彼の回答で sbeliv01 が使用する jQuery のような JS ライブラリは、すでに内部でそれをチェックしていると思います (これらの配列メソッドがネイティブで利用できない場合は、フォールバック ソリューションを提供します)。したがって、大幅なパフォーマンスの向上は期待しないでください。

于 2013-04-02T15:13:18.757 に答える
0

おそらく$.grep、jQuery の機能を使用する必要があります。

var test = [{
    "name": "John Doo"
}, {
    "name": "Foo Bar"
}]

var find = 'John Doo'

var found = $.grep(test, function(obj){
    return obj['name'] == find;
});

console.log(found);

フィドル: http://jsfiddle.net/ewBGt/3/

于 2013-04-02T14:17:41.763 に答える