我正在学习JavaScript,并尝试完成以下练习:
编写一个名为
要确定应该直接比较值(使用
在需要遍历对象属性进行比较时,
以下是我的解决方案,但它给我返回了
这是正确的解决方案:
我真的不明白我写的有什么问题,该怎么修复它。
非常感谢您帮助一个新手 :)
编写一个名为
deepEqual
的函数,它接受两个值作为参数,仅当它们是相同的值或具有相同属性的对象且属性值通过对deepEqual
的递归调用进行比较时相等时,才返回true
。要确定应该直接比较值(使用
===
操作符),还是比较它们的属性,您可以使用typeof
操作符。如果它对于两个值都产生“object”,那么您应该进行深度比较。但是您必须考虑一个愚蠢的例外:由于历史原因,typeof null
也会产生“object”。在需要遍历对象属性进行比较时,
Object.keys
函数会很有用。以下是我的解决方案,但它给我返回了
true
、false
和false
,这是不正确的。function deepEqual (a,b) {
if (a===b) return true;
if (typeof a=="object" && typeof b=="object") {
let x=Object.keys(a), y=Object.keys(b);
if (x.lenght==y.lenght) {
for (key of x){
if (y.includes(key)){
if (a[key]===b[key]) return true;
else return false;
}
}
}
return true;
}
}
let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
console.log(deepEqual(obj, {here: 1, object: 2}));
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
这是正确的解决方案:
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
let keysA = Object.keys(a), keysB = Object.keys(b);
if (keysA.length != keysB.length) return false;
for (let key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
return true;
}
let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
我真的不明白我写的有什么问题,该怎么修复它。
非常感谢您帮助一个新手 :)
length
拼错了。 - Dave Newtonfunction deepEqual(a, b) { if (a === b) return true; if (typeof a == "object" && typeof b == "object") { let x = Object.keys(a), y = Object.keys(b); if (x.length == y.length) { for (key of x) { if (y.includes(key)) { if (a[key] === b[key]) return true; else return false; } } } return true; } else return false; } let obj = {here: {is: "an"}, object: 2}; console.log(deepEqual(obj, obj));
但仍然无法正常工作... - Lorenzo Case Del Rosariolength
仍然拼错了,而且它仍然没有深入嵌套对象。 - Dave Newton