【问题标题】:forEach sum with arrow function gives unexpected results in Firebase Realtime DatabaseforEach 和箭头函数在 Firebase 实时数据库中给出了意想不到的结果
【发布时间】:2017-10-19 08:37:14
【问题描述】:

从 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)。谁能解释差异来自哪里?

【问题讨论】:

  • 首先如何在Object 中使用forEach?您向我们显示的返回数据不是符合Array.forEach 条件的Array

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

根据 firbase forEach 文档,

您可以随时通过 forEach 回调取消枚举 函数返回 true。

这里是你的第二种情况,

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

您在第一次迭代中返回了一些值(因为you are not using parenthesis),这被认为是正确的。因此它会停止进一步的迭代,因此您不会得到总和而是第一个值。

【讨论】:

  • 我知道这将是 javascript 基础知识!只是找不到合适的问题要问。谢谢!
【解决方案2】:

你对箭头函数格式有误解。

第一个:

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;}

作为firebase的文件:

您可以随时取消枚举,方法是让您的 forEach 回调函数返回 true。

在第一项:return loggedVal += log.val().myValue); // === true,这样它就停止了你的递归.forEach

p.s:也有人误会=> { abc }等于{ return { abc :abc} }

【讨论】:

    【解决方案3】:

    这就是它的样子

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

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 2014-06-22
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      相关资源
      最近更新 更多