【问题标题】:Recursively remove object which contains empty array in nest json object递归删除嵌套json对象中包含空数组的对象
【发布时间】:2016-07-12 16:50:14
【问题描述】:

我想动态删除包含空数组的 json 对象。我找到了这个链接similar question here。但就我而言,它对我不起作用。

假设我有一个 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 以优雅的方式解决它?

【问题讨论】:

  • 你的结构的可能深度是多少?是无限期的吗?您是否尝试实现树状结构
  • @Rouz 深度未知,但不是无限的。
  • @Sunson 那么可以在同一级别上存在元素吗?如果删除一个节点,子节点会发生什么?
  • @Rouz 如果我删除一个节点,只是因为它没有子节点,即数组为空。问题中已经给出了示例

标签: javascript json


【解决方案1】:

您可以使用breadth first 算法,该算法首先深入查看,然后在必要时删除。

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);

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2021-04-24
    • 2016-10-24
    • 1970-01-01
    • 2021-12-28
    • 2021-07-15
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多