lodash/underscore如何检查一个对象是否包含另一个对象的所有键/值对

11

这可能是一个简单的问题,但我在lodash API文档和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个回答

11

您可以使用一个匹配器

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

使用 mixin:

_.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

编辑

Underscore 1.8版本新增了一个_.isMatch函数。


需要注意的是,根据_.isMatch函数,空数组/对象值等同于任何和所有的数组/对象值。这可能是你想要的,也可能不是。如果你需要更严格(和深入)的比较,请参考posthtml-ast-compare - revelt
2018年3月23日的点踩有什么原因吗?匿名的点踩对任何人都没有帮助,我真的很想知道原因,以便我可以纠正答案。 - Gruff Bunny

9

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 ...

我想要一个函数,可以传递键/值对! - Bazinga
抱歉误解了你的问题。使用_.some方法进行了修正。 - Calvin Cheng
我喜欢这个“技巧”。看起来引擎底层有这样的功能。我在想是否有比创建新数组更简单的使用方法? - AlexStack

3

我认为并没有一个单独的下划线函数可以实现这个,但是你可以很容易地编写一个:

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

1
使用for..in循环并不是最好的选择。目前我正在使用这个函数:function containsAll(obj1, obj2) { return _.all(_.keys(obj2), function (key) { return obj1[key] === obj2[key]; }); } - AlexStack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接