我正在查看deepEqual
比較功能Eloquent Javascript練習。我認爲我可以通過將if
語句檢查對象存在和值相等性檢查到第一個for..in
循環而不是第二個循環來改進建議的解決方案。已修改deepEqual函數不起作用
我的推理是,如果對象沒有匹配的屬性或者它們的值不同,而不是在第二個循環中等待,它會允許檢查提前失敗。
的變化沒有工作。 This jsbin demonstrates the issue,這是代碼:
function deepEqual(a, b){
if(a === b) return true;
if(a === null || typeof a !== "object" ||
b === null || typeof b !== "object")
return false;
var pA = pB = 0;
//console.log('OBJECT detected vals:',a,b);
for(var p in a){
pA++;
//console.log('pA:'+pA, p, a, (p in b));
// MOVED THE IF STATEMENT INTO THIS LOOP INSTEAD OF THE
// SECOND LOOP BELOW
if(!(p in b) || !deepEqual(a[p], b[p]))
return false;
}
for(var p in b){
pB++;
//console.log('pB:'+pB, p, b, (p in a));
//if(!(p in a) || !deepEqual(a[p], b[p]))
//return false;
}
return pA === pB;
}
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true WORKS
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false WORKS
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true, DOES NOT WORK, LOGS OUT FALSE...?
註釋掉的代碼片段調用的console.log應該呈現以下輸出:
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
OBJECT detected vals: Object {here: Object, object: 2} Object {here: Object, object: 2}
pA:1 here Object {here: Object, object: 2} true
OBJECT detected vals: Object {is: "an"} Object {is: "an"}
pA:1 is Object {is: "an"} true
pB:1 is Object {is: "an"} true <-- why is this being called here, pA loop hasn't finished???
pA:2 object Object {here: Object, object: 2} true
pB:2 here Object {here: Object, object: 2} true
pB:3 object Object {here: Object, object: 2} true
從我所看到的,
for..in
爲b
參數在此處開始並影響後續運行的循環,具有正確的 值。
我錯過了什麼?
我認爲它的方式應該工作
據我瞭解,第三日誌應該運行如下:
CALL:
deepEqual({here: {is: "an"}, object: 2},{here: {is: "an"}, object: 2})
(a === b)
→false
,a
和b
是對象,繼續- 設置
pA
和pB
至0 開始
for..in
環pA
是1,p
爲here
here
是b
於是紛紛致電:deepEqual({is: "an"}, {is: "an"})
- 他們都是對象,所以去:
- 開始
for..in
環pA
爲1,p
是is
here
是b
於是紛紛致電:deepEqual("an", "an")
- < < < < < < < < < < < <返回true!
if
失敗,啓動循環的下一次迭代:
pA
是2,p
是object
object
是在b
所以必須調用:deepEqual(2, 2)
- th ey're兩個對象,所以還是:
- 開始
for..in
環pA
爲1,p
是is
here
是b
於是紛紛致電:deepEqual(a['is'], b['is'])
- < < < < < < < < < < < <返回true!
此時
pA
是2所有剩下要做的就是,迭代b中的道具
pB
應該是2
返回(pA === pB)
,與相同210,這是return true
它目前正在註銷false
。
啊哈!謝謝!我有一個暗示,這與此有關。我想我必須一直試圖做到這一點:'var pA,pB = pA = 0;'。我的推理是否將'if'條件移至第一個循環聲音? – Pineda
@Pineda不客氣。至於在任何一個循環中都有「if」條件,它不會真正改變一般(基於最壞情況)的效率。您的更改可能有助於某些特定情況,但會導致其他情況效率降低。基本上你所做的就是使'pA'更重要,即'pB',但如果有人通過反向參數比初始不變的方法更好。 – nem035
我現在看到了。非常感謝您的幫助。 – Pineda