【问题标题】:Not able to push an object into parent array by identifying the parent id of the object in javascript无法通过在 javascript 中识别对象的父 id 来将对象推送到父数组中
【发布时间】:2015-11-12 13:13:05
【问题描述】:

我有一个 JSON 数组,其属性为 id 和 parentActivityId。

$scope.data = [
    {
        id: 1,
        activityName: "Drilling",
        parentActivityId: 0,
        items: [
            {
                id: 2,
                activityName: "Blasting",
                parentActivityId: 1,
                items: [
                    {
                        id: 3,
                        activityName: "Ann",
                        parentActivityId: 2,
                        items: [],

                    },
                    {
                        id: 4,
                        activityName: "Ann",
                        parentActivityId: 2,
                        items: [],

                    }
                ]
            },
            {
                id: 5,
                activityName: "Transport",
                parentActivityId: 1,
                items: [
                    {
                        id: 6,
                        activityName: "Daniel",
                        parentActivityId: 5,
                        items: [],
                    }
                ]
            }
        ]
    }
];

我想推送一个基于parentActiityId 的新项目。新项目将有一个新的id。 示例:如果我的对象是这样的:

{
    id: 7,
    activityName: "Drilling",
    parentActivityId: 1,
    items: []
}

那么我的对象会是这个样子..

 $scope.data = [
        {
            id: 1,
            activityName: "Drilling",
            parentActivityId: 0,
            items: [
                {
                    id: 2,
                    activityName: "Blasting",
                    parentActivityId: 1,
                    items: [
                        {
                            id: 3,
                            activityName: "Ann",
                            parentActivityId: 2,
                            items: [],

                        },
                        {
                            id: 4,
                            activityName: "Ann",
                            parentActivityId: 2,
                            items: [],

                        },
                    {
                         id: 7,
                         activityName: "Drilling",
                         parentActivityId: 2,
                         items: [],
                     }
                    ]
                },
                {
                    id: 5,
                    activityName: "Transport",
                    parentActivityId: 1,
                    items: [
                        {
                            id: 6,
                            activityName: "Daniel",
                            parentActivityId: 5,
                            items: [],
                        }
                    ]
                }
            ]
        }
    ];

我尝试给出这个 for 循环..

var arrObj = {
    id: 7,
    activityName: "Drilling",
    parentActivityId: 1,
    items: []
};

function populateObj(arrObj) {
   for (var i = 0; i < $scope.data.length; i++) {
        if ($scope.data[i].id == arrObj.parentActivityId) {
            $scope.data.push(arrObj);
        }
    }
};

populateObj(arrObj);

这将只推送到父级。我想在 for 循环中识别子级,并通过识别 thr parentActivityId 来推送到特定的数组对象。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript arrays angularjs for-loop push


    【解决方案1】:

    使用递归提案和Array.prototype.reduce():

    var data=[{id:1,activityName:"Drilling",parentActivityId:0,items:[{id:2,activityName:"Blasting",parentActivityId:1,items:[{id:3,activityName:"Ann",parentActivityId:2,items:[]},{id:4,activityName:"Ann",parentActivityId:2,items:[]}]},{id:5,activityName:"Transport",parentActivityId:1,items:[{id:6,activityName:"Daniel",parentActivityId:5,items:[]}]}]}],
        child = { id: 7, activityName: "Drilling", parentActivityId: 1, items: [] };
    
    function getParent(r, a) {
        return a.id === child.parentActivityId ? a : a.items.reduce(getParent, r);
    }
    
    var node = data.reduce(getParent, {});
    'items' in node && node.items.push(child);
    
    document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

    【讨论】:

    • 如果没有数据,即data=[]。我无法添加新的子元素?
    • 那么你需要'if (items' in node) { node.items.push(child); } else { data.push(child); }。但是你有注意可能的错误parentId
    • 谢谢@Nina Scholz ..它按我需要的方式工作。你能解释一下你的代码吗。我不熟悉reduce功能。你可以给我发消息mailmrmanoj@gmail.com跨度>
    • 还有什么办法可以得到对象的总数吗?包括父对象
    • 请查看mdn,他们可以更好地解释。这个小代码可以计算对象的总数:function count(r, a) { return r + 1 + a.items.reduce(count, 0); } var nodeCount = data.reduce(count, 0);nodeCount 包含节点数。
    【解决方案2】:

    你已经接近你想要达到的目标了。这应该可以解决问题:

    var arrObj = {
        id: 7,
        activityName: "Drilling",
        parentActivityId: 1,
        items: []
    };
    
    function populateObj(data, arrObj) {
       for (var i = 0; i < data.length; i++) {
            if (data[i].id == arrObj.parentActivityId) {
                data[i].items.push(arrObj);
            } else {
                populateObj(data[i].items, arrObj);
            }
        }
    };
    
    populateObj(arrObj);
    

    【讨论】:

    • 我想检查内部对象以及我没有在 if ($scope.data[i].id == arrObj.parentActivityId) 中做的事情。如何检查 arrObj.parentActivityId 是否存在在 items 数组中也是如此?
    • 这次检查的目的是什么?
    • 如果 parentActivityId 为 7,那么我还必须检查 items 数组中的对象
    • 我不明白你在哪里推送你的新对象。在 parentActivityId 对应的items 数组中?为什么需要检查items数组中的对象?
    • 如果 parentActivityId 在 items 数组中,我必须推入 items 数组中
    【解决方案3】:

    要检查 items 数组中的对象,你可以这样做,

    var objectList = [
            {
                id: 1,
                activityName: "Drilling",
                parentActivityId: 0,
                items: [
                    {
                        id: 2,
                        activityName: "Blasting",
                        parentActivityId: 1,
                        items: [
                            {
                                id: 3,
                                activityName: "Ann",
                                parentActivityId: 2,
                                items: [],
    
                            },
                            {
                                id: 4,
                                activityName: "Ann",
                                parentActivityId: 2,
                                items: [],
    
                            },
                        {
                             id: 7,
                             activityName: "Drilling",
                             parentActivityId: 2,
                             items: [],
                         }
                        ]
                    },
                    {
                        id: 5,
                        activityName: "Transport",
                        parentActivityId: 1,
                        items: [
                            {
                                id: 6,
                                activityName: "Daniel",
                                parentActivityId: 5,
                                items: [],
                            }
                        ]
                    }
                ]
            }
        ];
    
    var arrObj = {
        id: 7,
        activityName: "Drilling",
        parentActivityId: 1,
        items: []
    };
    
    function populateObj(ItemList) {
       for (var i = 0; i < ItemList.length; i++) {
            if (ItemList[i].id == arrObj.parentActivityId) {
                ItemList[i].items.push(arrObj);
            }
           else
           {
             populateObj(ItemList[i].items);
           }
        }
    };
    
    populateObj(objectList);
    

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2020-10-11
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多