lodashのincludeメソッドを使用して、オブジェクトがコレクション内にあるかどうかを確認するにはどうすればよいですか?


146

lodashを使用すると、基本的なデータ型のメンバーシップを次のように確認できますincludes

_.includes([1, 2, 3], 2)
> true

ただし、以下は機能しません。

_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false

コレクションを検索する次のメソッドはうまく機能するように見えるので、これは私を混乱させます:

_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}

何が悪いのですか?コレクション内のオブジェクトのメンバーシップを確認するにはどうすればよいincludesですか?

編集:質問は元々lodashバージョン2.4.1向けでしたが、lodash 4.0.0向けに更新されました


7
_.containslodash v4で削除されました- _.includes代わりに使用してください
ビリームーン

@BillyMoonやったー!そうです、lodash v4.0.0(2016-01-12リリース)はcontainsエイリアスを削除します。これを更新します
Conrad.Dean

回答:


222

includes(以前containsinclude)メソッドは(と、より正確に、または参照によりオブジェクトを比較します===)。この例のの2つのオブジェクトリテラルは異なるインスタンスを{"b": 2}表すため、これらは等しくありません。通知:

({"b": 2} === {"b": 2})
> false

ただし、これは次のインスタンスが1つしかないため機能します{"b": 2}

var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true

一方、where(v4では非推奨)およびfindメソッドは、プロパティによってオブジェクトを比較するため、参照の等価性は必要ありません。の代わりにincludes、次のように試すこともできますsome(別名としてany):

_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true

12

の回答を補足するため、を使用せずにを使用p.s.w.gしてこれを実現する他の3つの方法を次に示します。lodash 4.17.5 _.includes()

オブジェクトentryの配列にオブジェクトを追加したいとしますnumbersentryまだ存在しない場合のみ) 。

let numbers = [
    { to: 1, from: 2 },
    { to: 3, from: 4 },
    { to: 5, from: 6 },
    { to: 7, from: 8 },
    { to: 1, from: 2 } // intentionally added duplicate
];

let entry = { to: 1, from: 2 };

/* 
 * 1. This will return the *index of the first* element that matches:
 */
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) });
// output: 0


/* 
 * 2. This will return the entry that matches. Even if the entry exists
 *    multiple time, it is only returned once.
 */
_.find(numbers, (o) => { return _.isMatch(o, entry) });
// output: {to: 1, from: 2}


/* 
 * 3. This will return an array of objects containing all the matches.
 *    If an entry exists multiple times, if is returned multiple times.
 */
_.filter(numbers, _.matches(entry));
// output: [{to: 1, from: 2}, {to: 1, from: 2}]

を返したい場合Booleanは、最初のケースで、返されているインデックスを確認できます。

_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.