首页 > 解决方案 > 为什么在循环中声明变量后输出错误?- (错误问题:如何在递归方法中使用 Promises 来声明变量?)

问题描述

这个问题基于这个问题: 如何在递归方法中添加求和列表?

这次我想计算resultObject. 因此,我创建了一个resultlist包含所有element.val数字的 a,一旦forEach循环结束,tempuserlist就会迭代并计算平均值。

这个平均对象就是新的result。此示例仅显示了我的数据集的一个小示例。对于更大的数据集,存在异步性问题。我已经尝试过 Promises,但真的不知道如何使用它们。有人有想法吗?

function somefunc(obj) {
   let temp = {};  
   let tempuserlist = [];
   for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
         if(!obj[key].hasOwnProperty("userlist")) {
            somefunc(obj[key]);
         }
         obj[key].userlist.forEach(function(element) {
            if (!temp.hasOwnProperty(element.name)){
              tempuserlist.push(temp[element.user] = { user: element.user});
              temp[element.user].resultlist = [];
              temp[element.user].val= 0;
            } temp[element.name].resultlist.push(element.val);
         });
         for (const user in tempuserlist) {
              tempuserlist[user].val= Math.round(tempuserlist[user].val/ tempuserlist[user].resultlist.length);
         }
      }
   }
   obj.userlist = tempuserlist;
}

标签: javascriptrecursionpromise

解决方案


好吧,伙计们,

当我准备一个小例子时,我注意到我的愚蠢错误......不应该在循环中计算平均值......否则会一次又一次地计算平均值......对不起,看起来我的问题没有任何内容毕竟与承诺和异步编程有关。至少结果现在还可以,我还没有感觉到任何异步行为;)

无论如何,我感谢你愿意帮助我。不过,您的建议帮助我从不同的角度看待事情,而不是拘泥于这些承诺。

function somefunc(obj) {
   let temp = {};  
      let tempuserlist = [];
      for (var key in obj) {
         if (obj.hasOwnProperty(key)) {
            if(!obj[key].hasOwnProperty("userlist")) {
               somefunc(obj[key]);
            }
            obj[key].userlist.forEach(function(element) {
               if (!temp.hasOwnProperty(element.name)){
                 tempuserlist.push(temp[element.user] = { user: element.user});
                 temp[element.user].resultlist = [];
                 temp[element.user].val= 0;
               } temp[element.name].resultlist.push(element.val);
            });
         }
      }
      for (const user in tempuserlist) {
        tempuserlist[user].val= Math.round(tempuserlist[user].val/ tempuserlist[user].resultlist.length);
      }
      obj.userlist = tempuserlist;
   }

推荐阅读