Koleksiyonda bir nesnenin olup olmadığını kontrol etmek için lodash'ta içerme yöntemini nasıl kullanırım?


152

lodash, temel veri türlerinin üyeliğini kontrol etmeme izin veriyor includes:

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

Ancak aşağıdakiler çalışmıyor:

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

Bu kafamı karıştırıyor çünkü bir koleksiyonda arama yapan aşağıdaki yöntemler gayet iyi görünüyor:

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

Neyi yanlış yapıyorum? Bir koleksiyondaki bir nesnenin üyeliğini ile nasıl kontrol ederim includes?

düzenleme: soru aslen Lodash 2.4.1 sürümü içindi, lodash 4.0.0 için güncellendi


7
_.containsLodash v4'te kaldırıldı - _.includesonun yerine kullanın
Billy Moon

@BillyMoon woops! evet haklısın, lodash v4.0.0 (2016-01-12'de yayınlandı) containstakma adı kaldırır . Bunu güncelleyeceğim
Conrad.Dean

Yanıtlar:


230

includes(Eski adıyla containsve include) yöntemi ile (daha doğrusu veya referans ile bu nesne karşılaştırır ===). Örneğinizdeki iki nesne değişmezi farklı örnekleri {"b": 2}temsil ettiğinden , bunlar eşit değildir. Farkına varmak:

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

Ancak, bu işe yarayacaktır çünkü şunların yalnızca bir örneği vardır {"b": 2}:

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

Öte yandan, where(v4'te kaldırılmıştır) ve findyöntemler nesneleri özelliklerine göre karşılaştırır, bu nedenle referans eşitliği gerektirmezler. Alternatif olarak includes, şunları denemek isteyebilirsiniz some(takma ad olarak da adlandırılır any):

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

12

Tarafından cevap desteklemek ciddi p.s.w.g, burada kullanarak bunu gerçekleştirmenin diğer üç yolu vardır lodash 4.17.5, kullanmadan _.includes() :

Sadece halihazırda yoksa , entrybir nesne dizisine nesne eklemek istediğinizi varsayalım.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}]

Bir döndürmek istiyorsanız Boolean, ilk durumda, döndürülen dizini kontrol edebilirsiniz:

_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.