【问题标题】:AngularJS and JSON - adding a child objectAngularJS 和 JSON - 添加子对象
【发布时间】:2014-02-08 20:56:46
【问题描述】:

我正在使用 AngularJS 并且在我的控制器中。我有我的 $scope.tree 变量来保存一个简单的 JSON 对象。我正在尝试构建一个嵌套树,数据来自几个休息调用。

在我的第一次 REST 调用之后,我成功地拥有了我的初始 $scope.tree 对象:

[
     {"name":"Item 1 Name","id":"1","parentid":"","children":[]},
     {"name":"Item 2 Name","id":"2","parentid":"","children":[]}
]

我进行了第二次 REST 调用并返回了 2 个元素:

{"name":"Item 3 Name","id":"3","parentid":"2","children":[]},
{"name":"Item 4 Name","id":"4","parentid":"2","children":[]} 

我想将这些作为适当的孩子添加到第一次调用中以结束:

[
     {"name":"Item 1 Name","id":"1","children":[]},
     {"name":"Item 2 Name","id":"2","children":[
          {"name":"Item 3 Name","id":"3","parentid":"2","children":[]},
          {"name":"Item 4 Name","id":"4","parentid":"2","children":[]}
     ]}
]

第三次调用:

{"name":"Item 5 Name","id":"5","parentid":"3","children":[]},
{"name":"Item 6 Name","id":"6","parentid":"4","children":[]} 

最终得到:

[
     {"name":"Item 1 Name","id":"1","children":[]},
     {"name":"Item 2 Name","id":"2","children":[
          {"name":"Item 3 Name","id":"3","parentid":"2","children":[
              {"name":"Item 5 Name","id":"5","parentid":"3","children":[]}
          ]},
          {"name":"Item 4 Name","id":"4","parentid":"2","children":[
              {"name":"Item 6 Name","id":"6","parentid":"4","children":[]} 
          ]}
     ]}
]

在我的控制器中,我有类似的东西:

$scope.tree = {};
$scope.restcall1 = (results of restcall)
$scope.restcall2 = (results of restcall)
$scope.restcall3 = (results of restcall)

$scope.tree = $scope.restcall1;

现在我需要加入 $scope.restcall1 和 $scope.restcall2 所以我用 addCall2 方法构建了一个 treeBuilder 服务。

$scope.tree = treeBuilder.addBranch($scope.tree, $scope.$restcall1);

在treeBuilder服务中:

    addBranch: function(branch, tree){
        for (var i=0; i<branch.length; i++){
            network = _.filter(tree, function(obj){
                if(obj.id == branch[i].parentId){
                    obj.children.push(branch[i]);
                }
            });
        }
        return tree;
    },

obj.children.push(new_branch);不起作用,我尝试了其他 10 种方法 - 我发现父对象很好,但找不到将分支添加到 parent.children 的方法。如您在上面看到的,如果有帮助,我可以使用下划线。

谢谢!

【问题讨论】:

    标签: javascript json angularjs rest


    【解决方案1】:

    我对你想做的事情的基本理解是这样的:

    var obj = {
        children:[]
    }
    obj.children.push({test:'Hello world'});
    console.log(obj.children);//[Object { test="Hello world"}]
    

    我说的对吗?

    【讨论】:

    • 没错,除非我找到我想要推送的父对象,否则我会这样做:console.log(obj.children) 并获取 [](好!)console.log(new_child) 并获取{"id:"3", "name":"Object 3"...} then: obj.children.push(new_child); 错误:obj.children.push 不是函数
    • 好的,但是你必须确保你的所有对象都带有 children 属性,你正在做一个循环,一些对象可以正确传递,而另一些则不能。
    • 我认为你的 obj.children 是一个字符串而不是一个数组,这就是它没有推送功能的原因。
    • console.log(typeof obj.children),输入看看。
    • 好的!好的!一个提示,你从你的休息电话中接收你的 json 格式的数据,如果你想在 javascript 中操作它,你最好将你的 json 转换为 javascript 对象。
    【解决方案2】:

    你的初始树:

    [
         {"name":"Item 1 Name","children":[]},
         {"name":"Item 2 Name","children":[]}
    ]
    

    您的第二次 REST 调用

    {"name":"Item 3 Name","id":"3","parentid":"2","children":[]},
    {"name":"Item 4 Name","id":"4","parentid":"2","children":[]}
    

    和你的代码:

    addBranch: function(branch, tree){
            for (var i=0; i<branch.length; i++){
                network = _.filter(tree, function(obj){
                    if(obj.id == branch[i].parentId){
                        obj.children.push(branch[i]);
                    }
                });
            }
            return tree;
        },
    

    我注意到两件事,您的初始树没有“id”或“父 id”,这个初始树将如何与您的上述算法一起使用?

    您的算法很“简单”,只需检查对象(object1)是否有 “parent id”属性,如果有,你只要拿着这个对象,在 你的对象数组(你的树)如果一个对象有(id === parent_id), 如果为真,您只需将对象(object1)推入另一个对象 数组属性“孩子”,然后你只需删除你的 object(object1) 从原始资源中,并寻找另一个对象 推入你的树。

    【讨论】:

    • Rodrigo - 抱歉,我编辑了我的代码以使其保持一致。当我试图让它更清晰时,我做了一些改变。并忘记使用 ID 编辑该呼叫以供稍后匹配。另外-我的代码匹配,所以我在父母和孩子身上都有正确的位置,但我不知道如何将孩子推到父母身上。 obj.children.push(branch[i]) 不起作用 - 这就是我要找的
    • console.log(branch[i]);这样做,看看分支里面有什么。
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 2016-12-27
    • 2015-07-20
    • 2016-06-29
    • 1970-01-01
    • 2018-06-05
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多