【问题标题】:How to do i match two object using lodash or javascript?如何使用 lodash 或 javascript 匹配两个对象?
【发布时间】:2019-05-04 07:05:37
【问题描述】:

我正在尝试使用 lodash 的 isMatch 函数来匹配下面的两个对象,但它总是给我正确的,因为我看到 perm 对象的长度不同并且不匹配下面的参数数组中缺少 day2 是我的方式试过了。

var  object  =   { 
  param: ['day1', 'day2', 'day3'],
  param2: ['day2', 'day3', 'day1', 'day0'],
  param3: ['day1'] 
};
var object2 = { 
  param: ['day3', 'day1'],
  param3: ['day1'],
  param2: ['day3', 'day2', 'day0', 'day1'] 
};

var matched = _.isMatch(object, object2);

console.log(matched)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

如果数组包含所有值并且匹配所有键,则数组将是有序的,那么它应该返回 true,否则返回 false。

【问题讨论】:

  • _.isEqual 可能更适合这里

标签: javascript lodash


【解决方案1】:

你可以使用这个纯 JavaScript 函数:

function match(a, b) {
    return Object.keys(a).every(key => {
        const set = new Set(a[key]);
        return key in b && b[key].length === a[key].length 
                        && b[key].every(val => set.has(val));
    });
}

var  object  =   {  param: ['day1', 'day2', 'day3'], param2: ['day2', 'day3', 'day1', 'day0'], param3: ['day1'] };
var object2 = { param: ['day3', 'day1'], param3: ['day1'], param2: ['day3', 'day2', 'day0', 'day1'] };

console.log(match(object, object2));

使用 lodash,您可以在每个键/值对上使用 difference

function match(a, b) {
    return _.every(a, (value, key) => !_.difference(value, b[key]).length);
}

var  object  =   {  param: ['day1', 'day2', 'day3'], param2: ['day2', 'day3', 'day1', 'day0'], param3: ['day1'] };
var object2 = { param: ['day3', 'day1'], param3: ['day1'], param2: ['day3', 'day2', 'day0', 'day1'] };

console.log(match(object, object2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    _.isMatch 基本上会告诉您第二个对象是否“包含”在第一个对象中。

    var object = { 'a': 1, 'b': 2 };
    
    _.isMatch(object, { 'b': 2 });
    // => true
    
    _.isMatch(object, { 'b': 1 });
    // => false
    

    (https://lodash.com/docs#isMatch)

    看来你需要_.isEqual

    (https://lodash.com/docs#isEqual)

    【讨论】:

      【解决方案3】:

      _.isEqual(值,其他)

      它在两个值之间执行深度比较以确定它们是否相等。 它支持比较数组、数组缓冲区、布尔值、日期对象、错误对象、映射、数字、对象对象、正则表达式、集合、字符串、符号和类型化数组。对象对象通过它们自己的而不是继承的、可枚举的属性进行比较。函数和 DOM 节点通过严格相等进行比较,即 ===

      var object = { 
        param: ['day1', 'day2', 'day3'],
        param2: ['day2', 'day3', 'day1', 'day0'],
        param3: ['day1'] 
      };
      
      var other = { 
        param: ['day1', 'day2', 'day3'],
        param2: ['day2', 'day3', 'day1', 'day0'],
        param3: ['day1'] 
      };
       
      _.isEqual(object, other);
      // returns true
      

      它将返回 true。

      var object = { 
        param: ['day1', 'day2', 'day3'],
        param2: ['day2', 'day3', 'day1', 'day0'],
        param3: ['day1'] 
      };
      
      var other = { 
        param: ['day3', 'day1'],
        param3: ['day1'],
        param2: ['day3', 'day2', 'day0', 'day1'] 
      };
      
      _.isEqual(object, other);
      // returns false
      

      它会返回假

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多