如何解决当使用Lodash的一个对象具有额外的键时,如何比较JSON对象中的键和值?
我有两个像这样的JSON对象:
var obj1 = {a: "apple",b: "banana",c: "carrot"}
var obj2 = {a: "apple",e: “egg” b: "banana",c: "carrot",d: "dog"}
我希望能够进行布尔检查以比较两个对象,而不必从任何一个中删除数据。例如,如果我要使用上面的数据,则布尔检查应返回 true ,因为两个对象中的键的值都匹配。
但是,可以说obj1
保持不变,但是obj2
如下:
var obj1 = {a: "apple",c: "carrot"}
var obj2 = {a: "ant",d: "dog"}
使用此数据,它应该返回 false ,因为即使其他字段匹配且某些字段匹配, a 键的值也不匹配在两个对象中都不存在。
有什么想法吗?我更喜欢使用Lodash,因为它们具有质量库。最初是尝试使用_.isEqual(obj1,obj2)
,但它不能满足我的确切需求。
解决方法
我不知道lodash
是否具有这种方法。但是,仅使用Object.etnries
和Array.every
方法就可以达到相同的结果。
var obj1 = {
a: "apple",b: "banana",c: "carrot"
}
var obj2 = {
a: "apple",c: "carrot",d: "dog",e: "egg"
}
var obj3 = {a: "apple",c: "carrot"}
var obj4 = {a: "ant",e: "egg",d: "dog"}
function checkEquality(a,b) {
const entries1 = Object.entries(a);
const entries2 = Object.entries(b);
const short = entries1.length > entries2 ? entries2 : entries1; // pick the shorter array
const long = short === entries1 ? b : a;
const isEqual = short.every(([k,v]) => long[k] === v);
return isEqual;
}
console.log(checkEquality(obj1,obj2))
console.log(checkEquality(obj3,obj4))
,
_.isMatch
可能会有所帮助。检查以下代码段
var obj1 = {
a: "apple",d: "dog"
}
console.log(_.isMatch(obj2,obj1));
var obj1 = {
a: "apple",c: "carrot"
}
var obj2 = {
a: "ant",obj1));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>
注意,_.isMatch(obj1,obj2)
不起作用。您将需要添加一些逻辑来确定哪个对象具有更多键,并将其作为第一个参数传递。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。