2017-06-21 177 views
-1

我有這種格式的JSON數據:如何過濾嵌套的JSON數據

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

我想從foo3與名foo4取出孩子陣列。並返回一個沒有孩子的整個數組。

可以這樣說:我有一個名字foo4,根據這個值,我想從兒童鑰匙中刪除對象。

過濾前:

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

過濾後

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

此JSON對象可以有無限的嵌套子。我不知道如何過濾數組。遞歸最適合這裏嗎?

+2

你能告訴你試過嗎? –

+0

你能否詳細解釋一下?因爲這個問題是從一個非常具體的問題開始的,「刪除foo3中包含foo4的孩子」,但是後來修補程序的行爲應該是相當動態的,因爲您擁有無限的嵌套子代?什麼時候應該刪除? –

+0

如果您無法輕鬆檢索要刪除的數據,也許這不是表示數據的最佳結構? – sjahan

回答

0

不要刪除數組中的子數組,因爲您說它將出現在許多數組中。 你必須做的是,在JavaScript /或任何服務器端郎,你可以檢查這種情況,如果你的數組有兒童數組,然後什麼都不做。

+0

但我需要根據名稱過濾數組,並從原始數組中刪除該特定對象。 –

+0

好的夥計。我想你想像我在jsfiddle上那樣做。 –

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

0

我創建了一個函數,它接受一個對象數組,倒空的兒童陣列每當NOx水平深(參數maxDepth),使用遞歸。 我使用柯里裏來追蹤所有對象每次遞歸的級別(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);