简体   繁体   中英

Remove element from JSON array recursively

I have the following json array:

{
"id": "1004482725",
"parent": 0,
"industry": "Akrotiri",
"industry_id": "root",
"name": "Comp",
"percentage": "0",
"report": "null",
"description": "",
"subsidiary": "3",
"children": [{
    "id": "1004482733",
    "parent": "1004482725",
    "industry": "Akrotiri",
    "industry_id": "industry9",
    "name": "Comp11",
    "percentage": "30",
    "report": "null",
    "description": "",
    "subsidiary": "1",
    "children": [{
        "id": "1004482734",
        "parent": "1004482733",
        "industry": "Akrotiri",
        "industry_id": "industry10",
        "name": "Comp110",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "aa02634",
            "parent": "1004482734",
            "industry": "",
            "industry_id": "0",
            "name": "Sef 4",
            "percentage": "4",
            "report": "null",
            "description": "",
            "subsidiary": "0",
            "children": []
        }]
    }, {
        "id": "1004482735",
        "parent": "1004482733",
        "industry": "Akrotiri",
        "industry_id": "industry11",
        "name": "Comp111",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "aa02635",
            "parent": "1004482735",
            "industry": "",
            "industry_id": "0",
            "name": "Sef 5",
            "percentage": "5",
            "report": "null",
            "description": "",
            "subsidiary": "0",
            "children": []
        }]
    }, {
        "id": "1004482736",
        "parent": "1004482733",
        "industry": "Akrotiri",
        "industry_id": "industry12",
        "name": "Comp112",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "1004482737",
            "parent": "1004482736",
            "industry": "Akrotiri",
            "industry_id": "industry13",
            "name": "Comp1120",
            "percentage": "100.00",
            "report": "null",
            "description": "",
            "subsidiary": "2",
            "children": [{
                "id": "1004482738",
                "parent": "1004482737",
                "industry": "Akrotiri",
                "industry_id": "industry14",
                "name": "Comp11200",
                "percentage": "100.00",
                "report": "null",
                "description": "",
                "subsidiary": "1",
                "children": [{
                    "id": "1004482739",
                    "parent": "1004482738",
                    "industry": "Akrotiri",
                    "industry_id": "industry15",
                    "name": "Comp112000",
                    "percentage": "100.00",
                    "report": "null",
                    "description": "",
                    "subsidiary": "1",
                    "children": [{
                        "id": "aa02636",
                        "parent": "1004482739",
                        "industry": "",
                        "industry_id": "0",
                        "name": "Sef 6",
                        "percentage": "6",
                        "report": "null",
                        "description": "",
                        "subsidiary": "0",
                        "children": []
                    }]
                }]
            }]
        }, {
            "id": "1004482740",
            "parent": "1004482736",
            "industry": "Akrotiri",
            "industry_id": "industry16",
            "name": "Comp1121",
            "percentage": "100.00",
            "report": "null",
            "description": "",
            "subsidiary": "1",
            "children": [{
                "id": "1004482741",
                "parent": "1004482740",
                "industry": "Akrotiri",
                "industry_id": "industry17",
                "name": "Comp11210",
                "percentage": "100.00",
                "report": "null",
                "description": "",
                "subsidiary": "1",
                "children": [{
                    "id": "aa02637",
                    "parent": "1004482741",
                    "industry": "",
                    "industry_id": "0",
                    "name": "Sef 7",
                    "percentage": "7",
                    "report": "null",
                    "description": "",
                    "subsidiary": "0",
                    "children": []
                }]
            }]
        }, {
            "id": "1004482742",
            "parent": "1004482736",
            "industry": "Akrotiri",
            "industry_id": "industry18",
            "name": "Comp1122",
            "percentage": "30.00",
            "report": "null",
            "description": "",
            "subsidiary": "2",
            "children": [{
                "id": "1004482743",
                "parent": "1004482742",
                "industry": "Akrotiri",
                "industry_id": "industry19",
                "name": "Comp11220",
                "percentage": "100.00",
                "report": "null",
                "description": "",
                "subsidiary": "1",
                "children": [{
                    "id": "aa02638",
                    "parent": "1004482743",
                    "industry": "",
                    "industry_id": "0",
                    "name": "Sef 8",
                    "percentage": "8",
                    "report": "null",
                    "description": "",
                    "subsidiary": "0",
                    "children": []
                }]
            }]
        }]
    }]
}, {
    "id": "1004482726",
    "parent": "1004482725",
    "industry": "Akrotiri",
    "industry_id": "industry2",
    "name": "Comp10",
    "percentage": "30",
    "report": "null",
    "description": "",
    "subsidiary": "1",
    "children": [{
        "id": "1004482732",
        "parent": "1004482726",
        "industry": "Akrotiri",
        "industry_id": "industry8",
        "name": "Comp102",
        "percentage": "30",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "aa02633",
            "parent": "1004482732",
            "industry": "",
            "industry_id": "0",
            "name": "Sef 3",
            "percentage": "3",
            "report": "null",
            "description": "",
            "subsidiary": "0",
            "children": []
        }]
    }, {
        "id": "1004482728",
        "parent": "1004482726",
        "industry": "Akrotiri",
        "industry_id": "industry4",
        "name": "Comp101",
        "percentage": "30",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "1004482729",
            "parent": "1004482728",
            "industry": "Akrotiri",
            "industry_id": "industry5",
            "name": "Comp1010",
            "percentage": "100.00",
            "report": "null",
            "description": "",
            "subsidiary": "1",
            "children": [{
                "id": "1004482730",
                "parent": "1004482729",
                "industry": "Akrotiri",
                "industry_id": "industry6",
                "name": "Comp10100",
                "percentage": "100.00",
                "report": "null",
                "description": "",
                "subsidiary": "1",
                "children": [{
                    "id": "1004482731",
                    "parent": "1004482730",
                    "industry": "Akrotiri",
                    "industry_id": "industry7",
                    "name": "Comp101000",
                    "percentage": "100.00",
                    "report": "null",
                    "description": "",
                    "subsidiary": "1",
                    "children": [{
                        "id": "aa02632",
                        "parent": "1004482731",
                        "industry": "",
                        "industry_id": "0",
                        "name": "Sef 2",
                        "percentage": "2",
                        "report": "null",
                        "description": "",
                        "subsidiary": "0",
                        "children": []
                    }]
                }]
            }]
        }]
    }, {
        "id": "1004482727",
        "parent": "1004482726",
        "industry": "Akrotiri",
        "industry_id": "industry3",
        "name": "Comp100",
        "percentage": "30",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "aa02631",
            "parent": "1004482727",
            "industry": "",
            "industry_id": "0",
            "name": "Sef1",
            "percentage": "1",
            "report": "null",
            "description": "",
            "subsidiary": "0",
            "children": []
        }]
    }]
}, {
    "id": "1004482744",
    "parent": "1004482725",
    "industry": "Akrotiri",
    "industry_id": "industry20",
    "name": "Comp12",
    "percentage": "30",
    "report": "null",
    "description": "",
    "subsidiary": "1",
    "children": [{
        "id": "1004482745",
        "parent": "1004482744",
        "industry": "Akrotiri",
        "industry_id": "industry21",
        "name": "Comp120",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "",
            "parent": "",
            "industry": "",
            "industry_id": "",
            "name": "",
            "percentage": "",
            "report": "",
            "description": "",
            "subsidiary": "",
            "children": ""
        }, {
            "id": "1004482748",
            "parent": "1004482745",
            "industry": "Akrotiri",
            "industry_id": "industry24",
            "name": "Comp1210",
            "percentage": "50.00",
            "report": "null",
            "description": "",
            "subsidiary": "2",
            "children": [{
                "id": "1004482749",
                "parent": "1004482748",
                "industry": "Akrotiri",
                "industry_id": "industry25",
                "name": "Comp12100",
                "percentage": "100.00",
                "report": "null",
                "description": "",
                "subsidiary": "1",
                "children": [{
                    "id": "1004482750",
                    "parent": "1004482749",
                    "industry": "Akrotiri",
                    "industry_id": "industry26",
                    "name": "Comp121000",
                    "percentage": "100.00",
                    "report": "null",
                    "description": "",
                    "subsidiary": "1",
                    "children": [{
                        "id": "aa02639",
                        "parent": "1004482750",
                        "industry": "",
                        "industry_id": "0",
                        "name": "Sef 9",
                        "percentage": "9",
                        "report": "null",
                        "description": "",
                        "subsidiary": "0",
                        "children": []
                    }]
                }]
            }]
        }, {
            "id": "",
            "parent": "",
            "industry": "",
            "industry_id": "",
            "name": "",
            "percentage": "",
            "report": "",
            "description": "",
            "subsidiary": "",
            "children": ""
        }]
    }, {
        "id": "1004482746",
        "parent": "1004482744",
        "industry": "Akrotiri",
        "industry_id": "industry22",
        "name": "Comp121",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "",
            "parent": "",
            "industry": "",
            "industry_id": "",
            "name": "",
            "percentage": "",
            "report": "",
            "description": "",
            "subsidiary": "",
            "children": ""
        }]
    }, {
        "id": "1004482747",
        "parent": "1004482744",
        "industry": "Akrotiri",
        "industry_id": "industry23",
        "name": "Comp122",
        "percentage": "30.00",
        "report": "null",
        "description": "",
        "subsidiary": "1",
        "children": [{
            "id": "aa02640",
            "parent": "1004482747",
            "industry": "",
            "industry_id": "0",
            "name": "Sef 10",
            "percentage": "10",
            "report": "null",
            "description": "",
            "subsidiary": "0",
            "children": []
        }]
    }]
}]
}

In this example i have some elements that looks like this:

 "children": [{
            "id": "",
            "parent": "",
            "industry": "",
            "industry_id": "",
            "name": "",
            "percentage": "",
            "report": "",
            "description": "",
            "subsidiary": "",
            "children": ""
        }

What i would like to achive is to eliminate this "childrens" from the original array. So far i've tried this function but it doesn't work the way i want:

 function deleteEmpty(data){
    if (data.children.length)
    {  

        nr = data.children.length;
        for (i=0;i<nr;i++)
        {
           // console.log(data.children[i]);

            if (data.children[i]["id"] == ""){
                console.log(data.children[i]);
                delete data.children[i];
            }                  
                this.deleteEmpty(data.children[i]);

        }
    }
    return data;
}

Also i have creatd a jsfiddle here : http://jsfiddle.net/fP7NS/2/ Please help me out or give me some hints with what i am doing wrong.

First (if necessary) turn your JSON string into an object. Your children property is sometimes an array, sometimes an empty array, and sometimes an empty string. This makes the logic a bit awkward. i suggest you write a function that tests whether a particular child is empty. Then you can write your main loop like this:

function isEmpty(node) {
    // logic for testing that a node is empty
}
function deleteEmptyChildren(node) {
    // assumes node is not empty
    if (Array.isArray(node.children)) {
        node.children = node.children.filter(
            function(child) {
                if (isEmpty(child)) {
                    return false;
                } else {
                    deleteEmptyChildren(child);
                    return true;
                }
            }
        );
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM