递归删除嵌套 json 对象中包含空数组的对象

Recursively remove object which contains empty array in nest json object

本文关键字:对象 包含空 数组 递归 嵌套 json 删除      更新时间:2023-09-26

我想动态删除包含空数组的json对象。我在这里找到了这个链接类似的问题。但就我而言,它对我不起作用。

假设我有一个 JSON 对象:

{"op":"1","parameters":[{"op":"2-1","parameters":[]},{"op":"2-2","parameters":[1,2]}]}

我写了一个示例代码来递归地完成这些工作:

function removeEmptyArray(cJSON){
    if(!cJSON)
        return cJSON;
    for(var i=cJSON.parameters.length-1;i>=0;i--){
        if(!(cJSON.parameters[i].parameters instanceof Array))
            continue;
        if(cJSON.parameters[i].parameters.length==0){
            cJSON.parameters.splice(i,1);
        }else{
            cJSON.parameters[i] = removeEmptyArray(cJSON.parameters[i]);
        }
    }
    return cJSON;
}

预期结果为{"op":"1","parameters":[{"op":"2-2","parameters":[1,2]}]},代码工作正常。

但是当我有这个 obj 时:

{"op":"1","parameters":[{"op":"2-1","parameters":[{"op":"3-1","parameters":[]}]},{"op":"2-2","parameters":[1,2,3]}]}

输出为{"op":"1","parameters":[{"op":"2-1","parameters":[]},{"op":"2-2","parameters":[1,2,3]}]}

显然,它不会动态删除"op"为"2-1"的 json obj。

那么如何使用纯javascript以优雅的方式解决它呢?

你可以使用广度优先算法,它首先查看深度,然后在必要时删除。

function isNotEmpty(object) {
    if (Array.isArray(object.parameters)) {
        object.parameters = object.parameters.filter(isNotEmpty);
        return object.parameters.length;
    }
    return true;
}
var object = { "op": "1", "parameters": [{ "op": "2-1", "parameters": [{ "op": "3-1", "parameters": [] }] }, { "op": "2-2", "parameters": [1, 2, 3] }] };
isNotEmpty(object);
console.log(object);