功能检查“;深度平等;嵌套对象的
Function checking for "deep equality" of nested objects
我正试图编写一个函数来检查两个对象是否具有相同的值。此函数要求我检查作为值存储在原始对象中的任何对象的相等性。我开发的方法(见下面的代码)是首先检查非对象值的相等性。然后,如果这些都匹配,我会再次迭代对象,并对原始函数进行递归调用,这样我就可以比较这两个对象的每个嵌套级别。
然而,这种方法只是部分起作用。递归调用的性质意味着我只能在对象的第一个键值对检查嵌套对象的相等性。一旦比较了第一组嵌套对象并返回递归调用,我就不知道如何检查包含嵌套对象的任何其他键值对。以下是功能:
var deepEqual = function(val1, val2) {
if (typeof val1 === 'object' && typeof val2 === 'object') {
for (i in val1) {
for (i in val2){
if (typeof val1[i] !== 'object' && typeof val2[i] !== 'object') {
if (val1[i] !== val2[i]) {
return false
}
}
}
}
for (i in val1) {
for (i in val2){
if (typeof val1[i] === 'object' && typeof val2[i] === 'object') {
return deepEqual(val1[i], val2[i])
}
}
}
return true
}
else if (val1 === val2) {
return true
}
else return false
}
我的基本问题是,我认为我需要一个递归调用来检查嵌套对象的深度相等性,但我只能成功地进行一次检查。有人试图解决这样的问题吗?如果您需要更具体的结果,我将提供特定对象的结果示例。谢谢
这里有一个可能的解决方案,但我建议您找到自己的解决方案。
function isEqual(var1, var2) { // Break the comparison out into a neat little function
if (typeof var1 !== "object") {
return var1===var2;
} else {
return deepEqual(var1, var2);
}
}
function deepEqual(var1, var2) {
for (i in var1) {
if(typeof var2[i] === "undefined") { // Quick check, does the property even exist?
return false;
}
if (!isEqual(var1[i], var2[i])) {
return false;
}
}
return true;
}
function areObjectsEqual(obj1, obj2) {
return deepEqual(obj1, obj2) && deepEqual(obj2, obj1); // Two-way checking
}
您不仅需要检查obj1
中的所有内容是否都存在于obj2
中,还需要检查obj2
中的所有信息是否都存在于obj1
中。这个解决方案需要通过两种方式进行比较,但您可以极大地优化这一点。
以及一些测试用例
var v1 = { obj0:"jan", obj:{ name:"jan"}, obj2:"ben" }
var v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan2"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }
console.log(areObjectsEqual(v1, v2))
v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben", obj3:"pig" }
console.log(areObjectsEqual(v1, v2))
您可能想要的是lodash
或underscore
库中的_.isEqual
。
还有来自Chai.js
断言库的deepEqual
测试。
一个简单的解决方案是JSON字符串化对象并比较它们的字符串表示。正如@Jan提到的。。。
只有当对象以完全相同的方式初始化时,这才会起作用方法如果属性相同但顺序不同,则失败
这有点脆,但可能适合你的目的。
相关文章:
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- 如何打印嵌套对象的所有值
- 设置嵌套对象属性的更好方法
- 嵌套对象结构
- 如何递归地获取嵌套对象中所有子对象的列表
- 更改嵌套对象的父子相关id
- 如何通过json对象数组为嵌套对象赋值
- Ember.js(2.5.0)如何设置嵌套对象值
- 嵌套对象文本访问父级
- 如何对两个嵌套对象进行排序
- 在javascript中使用方括号表示法的嵌套对象
- 具有嵌套对象数组的 Javascript 对象的递归搜索函数
- 更新嵌套对象的多个字段
- MongoDB嵌套对象数组后查询
- 在流星中插入嵌套对象
- 将嵌套对象数据添加到窗体中
- Chai深度包含了对嵌套对象的断言
- 使用Angular.js解析JSON中的嵌套对象数组
- 如何以编程方式添加到可变嵌套对象中
- Javascript嵌套对象访问根级别