【问题标题】:failing using call by reference to take the function return object value使用引用调用获取函数返回对象值失败
【发布时间】:2018-04-13 08:26:22
【问题描述】:

现在我实现了在用户组中查找用户的功能。这些是嵌套组,因此搜索是通过递归调用实现的。我的代码在下面列出;我也使用 redux。

我使用searchGroupUserAcc调用search来获取包含指定用户的目标组。我已经确认参数targetGroup被正确赋值了,但是不知道为什么搜索完成后它的值还是{}。

我很困惑;欢迎所有想法。谢谢。

function search(groups)(groups, tokenAcc, targetGroup){
    ...
    //search in a group; g is one group is groups
    for(let i=0;i<g.userList.length;++i) {
        if(g.userList[i]===tokenAcc) {
            //confirmed that targetGroup's value is not{}
            targetGroup=JSON.parse(JSON.stringify(g));
            return;
        }
    }
    //for searching subGroups 
    search(...);

}

//tokenAcc is the user account key used to search in the group array.
export function searchGroupUserAcc(tokenAcc){
     return (dispatch)=>{
         ...
         let targetG={};
         //use tokenAcc to search in groups. every group in groups contains the useraccount info
         //expect targetG to hold the return value.
         search(tokenAcc, groups,targetG);
         console.log(targetG);//still prints{}, but why
     };
}

【问题讨论】:

    标签: javascript redux pass-by-reference


    【解决方案1】:

    为什么不直接从search 函数返回值?

    if(g.userList[i]===tokenAcc) {
      return JSON.parse(JSON.stringify(g));
    }
    

    然后在你的第二个函数中:targetG = search(tokenAcc, groups,targetG);

    编辑

    鉴于您使用的是 redux,我强烈建议您转向更功能纯粹的方法,除其他外,这意味着您可以避免副作用(即您现在正在做什么)并始终使用函数的返回值。查看官方 redux documentation 了解更多信息

    【讨论】:

    • 我当然可以做到。只是这样,在处理叶子(在我的组树中)案例时,我还需要返回正确的值,这是一些额外的工作。这是我最后的手段
    • 编辑了我的答案
    【解决方案2】:

    你的朋友。

    Javascript 总是按值传递,但是当一个变量引用一个对象时,“值”就是对该对象的引用。

    因此,如果您更改变量的值永远不会更改底层基元或对象,它只会将变量指向一个新的基元或对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2018-06-23
      • 1970-01-01
      • 2017-08-01
      • 2011-12-28
      • 2022-10-18
      相关资源
      最近更新 更多