如何过滤嵌套的json数据

时间:2017-06-21 11:47:38

标签: javascript

我有这种格式的json数据:

[
  {'name':'foo1','id':'1'},
  {'name':'foo2','id':'2',children:[
                                   {'name':'foo3','id':'3',children:
                                           [
                                            {'name':'foo4','id':'4'}
                                           ]
                                   },
                                  ]
  },
  {'name':'foo','id':'1'},
]

我想从名为foo3的{​​{1}}中删除子数组。并且在没有孩子的情况下返回整个数组。

让我们说:我有一个名字foo4,基于这个值,我想从子键中删除该对象。

过滤前

foo4

过滤后

{'name':'foo3','id':'3',children:
                                           [
                                            {'name':'foo4','id':'4'}
                                           ]
                                   },

这个json对象可以有无限的嵌套子元素。我无法弄清楚如何过滤数组。递归最适合这里吗?

3 个答案:

答案 0 :(得分:0)

不要删除数组中的子数组,因为您说它将包含在许多数组中。 你需要做的是在javascript /或任何服务器端lang你可以检查这种情况,如果你的数组有子数组然后什么也不做。

答案 1 :(得分:0)

如果您只需要从第2级向下删除所有内容,我就不会认为递归是最佳选择。您应该检查每个对象的子项,如果他们有自己的孩子,只需删除它们。



var data = [
  {'name':'foo1','id':'1'},
  {'name':'foo2','id':'2',children:[
     {'name':'foo3','id':'3',children:
       [
        {'name':'foo4','id':'4'}
       ]
     },
    ]
  },
  {'name':'foo6','id':'6',children:[
     {'name':'foo7','id':'7',children:
       [
        {'name':'foo8','id':'8',children: [
            {'name':'foo9','id':'9'}
          ]
        }
       ]
     },
    ]
  },
  {'name':'foo','id':'1'},
];

var filteredData = data;
for(var i = 0; i < filteredData.length; ++i) {
  var object = filteredData[i];
  if(object.children) {
    //the object has property 'children'
    
    for(var j = 0; j < object.children.length; ++j) {
      var child = object.children[j];
      if(child.children) {
        //the child has children of its own
        child.children = [];
      }
    }
  }
}
console.log(filteredData);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我使用递归创建了一个函数,该函数接受一个对象数组并在每次x级深度(参数maxDepth)时清空子数组。 我使用currying来跟踪所有对象的每次递归的级别(xDeep)。

function removeDeepChildren(data, maxDepth) {
  var xDeep = 1;
  return function innerRecurring(arr) {
    for (var x = 0; x < arr.length; x++) {
      if (arr[x].children) {
        if (xDeep === maxDepth && arr[x].children) {
          arr[x].children = [];
        } else {
          ++xDeep;
          innerRecurring(arr[x].children);
        }
      }
    }
  }(data);
}

var data = [{'name':'foo1','id':'1'},{'name':'foo2','id':'2','children':[{'name':'foo3','id':'3','children':[{'name':'foo4','id':'4'}]}]},{'name':'foo','id':'1'}];

removeDeepChildren(data, 2);

console.log(data);