lodash / underscore проверьте, содержит ли один объект все ключи / значения из другого объекта
Это, вероятно, простой вопрос, но я не смог найти ответ из документов API lodash и Google.
предположим у меня есть объект такой:
var obj = {
code: 2,
persistence: true
}
Я хочу функцию, которую я могу передать пару ключ / значение и возвращает true, если ключ существует в моем объекте и имеет указанное значение:
_.XXXX(obj, {code: 2}); //true
_.XXXX(obj, {code: 3}); //false
_.XXXX(obj, {code: 2, persistence: false}); //false
_.XXXX(obj, {code: 2, persistence: true}); //true
Это как-то вроде where()
но только для одного объекта.
3 ответов
можно использовать matcher:
var result1 = _.matcher({ code: 2 })( obj ); // returns true
var result2 = _.matcher({ code: 3 })( obj ); // returns false
С миксин:
_.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
редактировать
версия 1.8 подчеркивания добавил _.isMatch
var obj = {
code: 2,
persistence: true
};
console.log(_.has(obj, 'code'));
мой плохой для непонимания вашего требования сначала.
вот исправленный ответ с _.some
https://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}) );
фокус в том, чтобы бросить объект, который вы хотите проверить как массив, так что _.some
сделает свое волшебство.
если вы хотите более приятную обертку вместо того, чтобы вручную бросать ее с []
, мы можем написать функцию, которая обертывает литье.
var checkTruth = function(obj, keyValueCheck) {
return _.some([obj], keyValueCheck);
};
console.log( checkTruth(obj, {code: 2}) );
... as above, just using the `checkTruth` function now ...
Я не думаю, что для этого есть одна функция подчеркивания, но вы можете легко написать:
function sameObject(ob1, ob2) {
for (var key in ob2) {
if (ob2[key] != ob1[key]) {
return false;
}
}
return true;
}