【发布时间】:2018-11-07 03:24:57
【问题描述】:
我有一个程序对提供给它的 2 个对象进行深度比较,并使用递归来这样做。我的问题是,由于我使用全局变量来保留信息,因此我必须每次在对函数进行任何后续调用之前重置它。除了使用全局变量之外,我还有什么方法可以维护变量值并让它不那么麻烦吗?
let isEqual = true;
function deepEqual(object1, object2) {
if (!((typeof(object1) == 'object' && typeof(object2) == 'object') || (object1 && object2))) {
return isEqual = object1 === object2;
} else if (typeof(object1) == 'object' && typeof(object2) == 'object') {
if ((object1 && object2)) {
let object1Keys = Object.keys(object1);
let object2Keys = Object.keys(object2);
if (object1Keys.length == object2Keys.length) {
for (let index = 0; index < object1Keys.length; index++) {
if (isEqual) {
if (!(typeof(object1[object1Keys[index]]) == 'object' && typeof(object2[object2Keys[index]]) == 'object')) {
isEqual = (object1[object1Keys[index]] === object2[object2Keys[index]]) && (object1Keys[index] === object2Keys[index]);
} else {
deepEqual(object1[object1Keys[index]], object2[object2Keys[index]]);
}
} else {
return isEqual = false;
}
}
}
}
}
return isEqual;
}
let obj1 = {
a: 'somestring',
b: 42,
c: {
1: 'one',
2: {
4: 'Three'
}
}
};
let obj2 = {
a: 'somestring',
b: 42,
c: {
1: 'one',
2: {
3: 'Three'
}
}
};
console.log("obj1 == obj2 : ");
console.log(deepEqual(obj1, obj2));
let obj3 = {
a: 'somestring',
b: 42,
c: {
1: 'one',
2: {
3: 'Three'
}
}
};
let obj4 = {
a: 'somestring',
b: 42,
c: {
1: 'one',
2: {
3: 'Three'
}
}
};
console.log("obj3 == obj4 : ");
isEqual = true;
console.log(deepEqual(obj3, obj4));
let obj = {name: {gender: "F"}, age: 20};
isEqual = true;
console.log(deepEqual(obj, {name: {gender: "F"}, age: 20}));
【问题讨论】:
-
JSON.stringify(obj1) === JSON.stringify(obj2) // JSON.stringify(obj3) === JSON.stringify(obj4)
-
@RandyCasburn 谢谢!有没有办法通过纯递归函数来实现它。我想学习递归,或者说是实现它的好方法。 :)
-
recursive diff 和 recursive union - 我认为这两个问答将向您展示其他需要考虑的重要事项。
-
比较密钥的长度是不可靠的。
{ a: 1 }和{ b: 2 }都有一个键,但这并不能告诉你什么是平等的。 -
{ a: /foo/ }和{ a: /foo/ }是否被视为相等?{ a: someFunc }和{ a: someFunc }怎么样?也可以考虑其他复杂的对象,例如 HTMLElement。您必须提出并回答更多问题,才能使您的对象相等函数变得健壮可靠。
标签: javascript recursion