【问题标题】:lodash/underscore check if one object contains all key/values from another objectlodash/underscore 检查一个对象是否包含来自另一个对象的所有键/值
【发布时间】:2015-06-03 13:11:26
【问题描述】:

这可能是一个简单的问题,但我无法从 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(),但只针对一个对象。

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    你可以使用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 函数。

    【讨论】:

    • 需要注意的是according_.isMatch,空数组/obj。 value 等于 any and every 数组/obj。价值。这可能是也可能不是你想要的。如果您需要更严格(和深入)的比较,请参阅posthtml-ast-compare
    • 2018 年 3 月 23 日投反对票的任何理由?匿名投票对任何人都没有帮助,我真的很想知道原因,以便我可以更正答案。
    【解决方案2】:

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

    【讨论】:

    • 我想要一个可以传递键/值对的函数!
    • 我很抱歉误解了你的问题。使用_.some 解决方案进行了修订。
    • 我喜欢这个“把戏”。似乎引擎盖下有这样的功能。我想知道是否有比创建新数组更简单的使用方法?
    • 我觉得lodash没有内置这样的功能。 ramdajs 确实内置了这样的功能 - ramdajs.com/docs/#where ramdajswhere 完全符合您的要求。在我的项目中,我更喜欢ramdajs 而不是lodash 而不是underscore。但这不是我想的重点……你想知道lodash
    【解决方案3】:

    我不认为有一个单一的下划线函数,但你可以很容易地写一个:

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

    【讨论】:

    • 使用for..in 循环并不是最好的。目前我正在使用这个功能:function containsAll(obj1, obj2) { return _.all(_.keys(obj2), function (key) { return obj1[key] === obj2[key]; }); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多