如何使用lodash或javascript匹配两个对象?

时间:2019-05-04 07:05:37

标签: javascript lodash

我正在尝试使用lodash的isMatch函数来匹配以下两个对象,但是它始终使我为真,因为我看到烫发对象的长度不同并且不匹配,或者下面的参数数组缺少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。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

它将返回false