for每个带箭头的总和函数都会在 Firebase 实时数据库中给出意外结果



来自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);

相关内容

  • 没有找到相关文章

最新更新