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


https://lodash.com/docs#has

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;
}