2015-03-30 26 views
5

Bu muhtemelen kolay bir sorudur, ancak lodash API dokümanlarından ve Google'dan bir yanıt bulamadım.lodash/underscore Bir nesnenin başka bir nesnedeki tüm anahtar/değerleri içerip içermediğini kontrol etme

var obj = { 
    code: 2, 
    persistence: true 
} 

ben bir anahtar/değer çiftini geçirmeleri ve anahtar benim nesne var ve belirtilen değeri varsa true döndüren bir işlev istiyorum:

en Böyle bir nesne olduğunu varsayalım

_.XXXX(obj, {code: 2}); //true 
_.XXXX(obj, {code: 3}); //false 
_.XXXX(obj, {code: 2, persistence: false}); //false 
_.XXXX(obj, {code: 2, persistence: true}); //true 

Bu, bir şekilde where() gibidir, ancak yalnızca bir nesne içindir.

cevap

6

Bir matcher kullanabilirsiniz

_.mixin({ keyvaluematch: function(obj, test){ 
    return _.matcher(test)(obj); 
}}); 

var result1 = _.keyvaluematch(obj, { code: 2 }); // returns true 
var result2 = _.keyvaluematch(obj, { code: 3 }); // returns false 

Edit

Versiyon çizgi 1,8 bir _.isMatch fonksiyonu eklendi. `For..in` döngüsünü kullanarak

+0

[Buna göre] (https://lodash.com/docs/4.17.0#isMatch) '_.isMatch', boş dizi/obj’e dikkat etmek önemlidir. Değer _any ve her_ dizi/obj'e eşittir. değer. İstediğin şey bu olabilir ya da olmayabilir.Daha sıkı (ve derin) karşılaştırmaya ihtiyacınız varsa, [posthtml-ast-compare] 'a bakın (https://www.npmjs.com/package/posthtml-ast-compare). – revelt

2

Bunun için tek alt çizgi işlevi yoktur sanmıyorum, ancak kolayca birini yazabilirsiniz:

function sameObject(ob1, ob2) { 
    for (var key in ob2) { 
     if (ob2[key] != ob1[key]) { 
      return false; 
     } 
    } 
    return true; 
} 
+1

en iyisi değil. Şu anda bu işlevi kullanıyorum: 'function includesAll (obj1, obj2) { return _.all (_. Tuşları (obj2), işlev (anahtar) { return obj1 [anahtar] === obj2 [anahtar]; }); } ' – AlexStack

5

https://lodash.com/docs#has

var obj = { 
    code: 2, 
    persistence: true 
}; 

console.log(_.has(obj, 'code')); 

ilk başta gereksinimi yanlış anlama Benim kötü.

İşte _.somehttps://lodash.com/docs#some

var obj = { 
    code: 2, 
    persistence: true 
}; 

console.log(_.some([obj], {code: 2})); 
console.log(_.some([obj], {code: 3})); 
console.log(_.some([obj], {code: 2, persistence: false})); 
console.log(_.some([obj], {code: 2, persistence: true})); 

hüner Eğer _.some sihrini böylece Array olarak kontrol etmek istediğiniz nesneyi döküm etmektir ile düzeltilmiş bir cevap.

[] ile manuel olarak dökmek yerine, daha iyi bir sarıcı istiyorsanız, döküm işlemini tamamlayan bir işlev yazabiliriz. Bir mixin ile

var result1 = _.matcher({ code: 2 })(obj); // returns true 
var result2 = _.matcher({ code: 3 })(obj); // returns false 

:

var checkTruth = function(obj, keyValueCheck) { 
    return _.some([obj], keyValueCheck); 
}; 

console.log(checkTruth(obj, {code: 2})); 
... as above, just using the `checkTruth` function now ... 
+0

Anahtar/değer çiftini geçirebileceğim bir işlev istiyorum! – Bazinga

+0

Sorunu yanlış anlamam kötüdür. '_.some' çözümü ile revize edildi. –

+0

"Hile" yi beğeniyorum. Kaputun altında böyle bir işlevsellik var gibi görünüyor. Yeni bir dizi oluşturmaktan daha kolay bir yol olup olmadığını merak ediyorum. – AlexStack

İlgili konular