Javascript 删除对象数组中的所有子对象

Javascript 删除对象数组中的所有子对象,javascript,object,Javascript,Object,var-arr=[{ “id”:“1”, “名称”:“新闻”, }, { “id”:“3”, “家长”:“1”, “名称”:“新闻2” }, { “id”:“5”, “家长”:“3”, “名称”:“新闻”, }, { “id”:“7”, “家长”:“5”, “名称”:“新闻2” }, { “id”:“15”, “名称”:“新闻2” }, { “id”:“20”, “名称”:“新闻2” }]; 已删除的var_id=1; 对于(变量i=0;i=0) 阵列拼接(索引1); } 删除项('1') 控制

var-arr=[{
“id”:“1”,
“名称”:“新闻”,
}, {
“id”:“3”,
“家长”:“1”,
“名称”:“新闻2”
}, {
“id”:“5”,
“家长”:“3”,
“名称”:“新闻”,
}, {
“id”:“7”,
“家长”:“5”,
“名称”:“新闻2”
}, {
“id”:“15”,
“名称”:“新闻2”
}, {
“id”:“20”,
“名称”:“新闻2”
}];
已删除的var_id=1;
对于(变量i=0;i}
我想这对你会有用的

var arr=[{
id:1,
名称:“新闻”,
},
{  
id:3,
家长:1,,
名称:“新闻2”
},
{  
id:“5”,
家长:3,,
名称:“新闻”,
},
{  
id:7,
家长:5,,
名称:“新闻2”
},
{  
身份证号码:15,
名称:“新闻2”
},
{  
身份证号码:20,
名称:“新闻2”
}];
已删除的var_id=5;
对于(变量i=0;i控制台日志(arr)首先,您应该找到层次关系。然后根据
id
您想要删除它的子项,并与父项一起删除它们

var arr=[{“id”:“1”,“name”:“News”,},{“id”:“3”,“parent”:“1”,“name”:“News 2”},{“id”:“5”,“parent”:“3”,“name”:“News”,},{“id”:“7”,“parent”:“5”,“name”:“News 2”},{“id”:“15”,“name”:“News 2”},{“id”:“20”,“name”:“News 2”};
console.clear();
var children={};
arr.forEach(功能(项目){
如果(项.父项)
子项[item.parent]=(子项[item.parent]| |[]).concat(item.id);
});
函数deleteItem(id){
if(子项[id])
子项[id]。forEach(删除项)
var指数=arr.findIndex(i=>i.id==id);
如果(索引>=0)
阵列拼接(索引1);
}
删除项('1')
控制台日志(arr)试试这把小提琴:

代码如下:

var arr = [{
        "id": "1",
        "name": "News",
        }, {
        "id": "3",
        "parent": "1",
        "name": "News 2"
        }, {
        "id": "5",
        "parent": "3",
        "name": "News",
        }, {
        "id": "7",
        "parent": "5",
        "name": "News 2"
        }, {
        "id": "15",
        "name": "News 2"
        }, {
        "id": "20",
        "name": "News 2"
    }];

    var deleted_id = 1;
    var foundIds = [];
    var findIds = function(delId) {
        var item = arr.find(function(x) { 
            return x.id == delId;
        });

        if (foundIds.indexOf(item.id) === -1) {
            foundIds.push(item.id);            
        }

        var children = arr.filter(function(x) { 
            return x.parent == item.id;
        });

        children.forEach(function(it) {
            findIds(it.id);    
        });
    }
    findIds(deleted_id);
    var newArr = arr.filter(function(x) {
        return foundIds.indexOf(x.id) === -1;
    });
    console.log(newArr);

此建议首先构建一棵树,然后获取一个id为的数组以删除。然后应用过滤器,只获取不在列表中的一个

var arr=[{“id”:“1”,“name”:“News”,},{“id”:“3”,“parent”:“1”,“name”:“News 2”},{“id”:“5”,“parent”:“3”,“name”:“News”,},{“id”:“7”,“parent”:“5”,“name”:“News 2”},{“id”:“15”,“name”:“News 2”},{“id”:“20”,“name”:“News 2”},
id='1',
idsToDelete=函数(数据){
var-tree={},ids={};
data.forEach(函数(a,i){
tree[a.id]={id:a.id,子项:tree[a.id]&&tree[a.id].children};
如果(a.父母){
树[a.parent]=树[a.parent]| |{};
tree[a.parent]。children=tree[a.parent]。children | |[];
树[a.parent].children.push(树[a.id]);
}
});
[tree[id].forEach(函数iter(a){
ids[a.id]=真;
a、 儿童和a.children.forEach(iter);
});
返回ID;
}(arr);
arr=arr.filter(函数(a){return!idsToDelete[a.id];});

控制台日志(arr)在比较中使用父级之前,应该检查它是否存在。此外,您还应该缓存数组的长度,因为您在for循环中更改了长度。continue语句也是完全冗余的。我只有一个第一个id。我需要删除这个id的所有子项所有深层的子项。
var
    arr = [{
        "id": "1",
        "name": "News"
    }, {
        "id": "3",
        "parent": "1",
        "name": "News 2"
    }, {
        "id": "5",
        "parent": "3",
        "name": "News"
    }, {
        "id": "7",
        "parent": "5",
        "name": "News 2"
    }, {
        "id": "15",
        "name": "News 2"
    }, {
        "id": "20",
        "name": "News 2"
    }];


arr = arr.reduce(function collectItemsBySkippingIds (collector, item) {
    var
        unskippedItemList = collector.unskippedItemList,
        skipItemByIdList  = collector.skipItemByIdList,

        isSkipViaId     = (skipItemByIdList.indexOf(item.id)      >= 0),
        isSkipViaParent = (skipItemByIdList.indexOf(item.parent)  >= 0);

    if (isSkipViaId || isSkipViaParent) {
        if (isSkipViaParent) {
            skipItemByIdList.push(item.id);
        }
    } else {
        unskippedItemList.push(item);
    }
    return collector;

}, {

    unskippedItemList : [],
    skipItemByIdList  : ["1"]

}).unskippedItemList;


console.log("arr : ", arr);