来自Firebase Cloud Functions,我在Firebase Realtime DB中像这样查询:
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)。谁能解释一下差异来自哪里?
根据每个文档的 firbase,
您可以随时通过 forEach 回调来取消枚举 函数返回 true。
在你的第二种情况下,
logs.forEach(log => loggedVal += log.val().myValue);
您在第一次迭代中返回了一些值(因为您没有使用括号),这被认为是 true。因此,它会停止进一步的迭代,因此您不会得到总和,而是第一个值。
你误解了箭头函数的格式。
第一个:
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} }
这是它应该的样子
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);