0

從火力地堡雲功能我做查詢在火力地堡實時數據庫是這樣的:的forEach和箭頭功能給出了火力地堡實時數據庫意想不到的效果

let logs = this.firebase.database() 
.ref('logs') 
.orderByChild("userId").equalTo(userId) 
.once('value'); 

返回數據:

{ 
    "id1abc": { 
    "myValue": 1, 
    "userId": "abc" 
    }, 
    "id2abc": { 
    "myValue": 2, 
    "userId": "abc" 
    }, 
    "id3abc": { 
    "myValue": 3, 
    "userId": "abc" 
    } 
} 

查詢返回一對夫婦其中值我想總結的項目:

let loggedVal = 0; 
logs.forEach(log => { 
    loggedVal += log.val().myValue; 
}); 
return loggedVal; 

裏面的箭頭函數forEach在這種情況下給我適當的價值(總和等於6)。

但是當我刪除括號喜歡這裏:

let loggedVal = 0; 
logs.forEach(log => loggedVal += log.val().myValue); 
return loggedVal; 

返回值不是總和,但我從中遍歷的第一個元素(loggedVal == 6)只值。任何人都可以解釋差異來自哪裏?

+1

如何在一個'Object'中首先使用'forEach'?您向我們展示的返回數據不是符合「Array.forEach」條件的Array。 –

回答

3

由於每firbase forEach文檔,

可以通過讓你的forEach回調 函數返回true取消在任何時候枚舉。

在第二種情況下

這裏,

logs.forEach(log => loggedVal += log.val().myValue); 

你在你的第一次迭代(因爲you are not using parenthesis),這被認爲是真正的迴歸一定的價值。因此它會停止進一步的迭代,因此你不會得到總和而是第一個值。

+1

我知道這將是JavaScript基礎知識!只是找不到合適的問題。謝謝! –

0

這是它應該是什麼樣子

const logs = { 
    id1abc: { 
    myValue: 1, 
    userId: 'abc', 
    }, 
    id2abc: { 
    myValue: 2, 
    userId: 'abc', 
    }, 
    id3abc: { 
    myValue: 3, 
    userId: 'abc', 
    }, 
}; 

Object.keys(logs).reduce((tmp, x) => tmp + logs[x].myValue, 0); 
1
你誤解有關箭頭功能格式

一日一:

let loggedVal = 0; 
logs.forEach(log => { 
    loggedVal += log.val().myValue; 
}); 
return loggedVal; 

它等於ES5:

let loggedVal = 0; 
logs.forEach(function(log){ 
    loggedVal += log.val().myValue; 
}); 

return loggedVal; 

但第二之一:

let loggedVal = 0; 
logs.forEach(log => loggedVal += log.val().myValue); 
return loggedVal; 

它等於ES5:

let loggedVal = 0; 
logs.forEach(function(log){ 
    return loggedVal += log.val().myValue); 
}); 
return loggedVal; 

箭頭功能=> abc()表示{ return abc()},但是=> { abc }表示{abc(); return;}

的作爲火力的文件:

可以通過讓你的forEach回調函數返回true取消在任何時候枚舉。

在第一項:return loggedVal += log.val().myValue); // === true,以便它停止遞歸.forEach

P.S:也有人誤解=> { abc }等於{ return { abc :abc} }