lodash, includes
ile temel veri türlerinin üyeliğini kontrol etmeme izin veriyor:
_.includes([1, 2, 3], 2)
> true
Ancak aşağıdakiler çalışmıyor:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Bu benim kafamı karıştırıyor çünkü bir koleksiyonda arama yapan aşağıdaki yöntemler gayet iyi çalışıyor gibi 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 koleksiyonda includes
ile bir nesnenin üyeliğini nasıl kontrol edebilirim?
Düzenle: soru aslında lodash 2.4.1 sürümü içindi, lodash 4.0.0 için güncellendi
Includes][1] (eski adlarıyla
containsve
include) yöntemi nesneleri referansla (ya da daha doğrusu
===ile) karşılaştırır. Örneğinizdeki
{"b": 2}` iki nesne değişmezi farklı örnekleri temsil ettiğinden, bunlar eşit değildir. Dikkat edin:
({"b": 2} === {"b": 2})
> false
Ancak bu işe yarayacaktır çünkü {"b": 2}
ifadesinin yalnızca bir örneği vardır:
var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true
Öte yandan, where
(v4'te kullanımdan kaldırılmıştır) ve find
yöntemleri nesneleri özelliklerine göre karşılaştırır, bu nedenle referans eşitliği gerektirmezler. Includesyöntemine alternatif olarak [
some][4] (
any` olarak da adlandırılır) yöntemini deneyebilirsiniz:
_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true
Cevabı p.s.w.g
ile tamamlayarak, _.includes()
kullanmadan **lodash`4.17.5
kullanarak bunu başarmanın diğer üç yolunu aşağıda bulabilirsiniz:
Diyelim ki entry
nesnesini numbers
nesnelerinden oluşan bir diziye eklemek istiyorsunuz, sadece entry
zaten mevcut değilse.
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}]
Eğer bir Boolean
döndürmek istiyorsanız, ilk durumda döndürülen indeksi kontrol edebilirsiniz:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true