2016-10-21 2 views
1

У меня есть вложенный объект 4 уровня, который выглядит как этототфильтровывать глубоко вложенный объект и вернуть новый объект

{ 
    "name": "“Mike”", 
    "id": 1000, 
    "img": "“#”", 
    "children": [ 
    { 
     "name": "“Jack”", 
     "id": 1100, 
     "img": "#", 
     "married": true, 
     "children": [ 
     { 
      "name": "”Julia“", 
      "id": 1110, 
      "img": "#" 
     } 
     ] 
    }, 
    { 
     "name": "”Lily“", 
     "id": 1200, 
     "img": "#", 
     "married": true, 
     "children": [ 
     { 
      "name": "”Coco“", 
      "id": 1210, 
      "img": "#", 
      "married": true, 
      "children": { 
      "name": "”Olivia“", 
      "id": 1211, 
      "img": "#", 
      "married": false 
      } 
     } 
     ] 
    } 
    ] 
} 

У меня есть массив idToDisplay = ["1000","1100","1200","1210"] Я хочу, чтобы отфильтровать идентификаторы и оставить из части, которые не соответствуют idToDisplay, так что я могу получить новый объект выглядит следующим образом

{ 
    "name": "“Mike”", 
    "id": 1000, 
    "img": "“#”", 
    "children": [ 
    { 
     "name": "“Jack”", 
     "id": 1100, 
     "img": "#", 
     "married": true, 
     ] 
    }, 
    { 
     "name": "”Lily“", 
     "id": 1200, 
     "img": "#", 
     "married": true, 
     "children": [ 
     { 
      "name": "”Coco“", 
      "id": 1210, 
      "img": "#", 
      "married": true, 
     } 
     ] 
    } 
    ] 
} 

что лучший способ для перебора? Большое спасибо!

ответ

1

Если вы хотите изменить свои данные в месте можно рекурсивно пройти так:

var data = ... your data ... 
var ids = [1000, 1100] 
var handleNode = function(node) { 
    node.children = node.children.filter(x => ids.includes(x.id)) 
    node.children.forEach(handleNode) 
} 
if (!ids.includes(data.id)) {data = {}} 
handleNode(data) 

Затем ваши данные состоит только из узлов с соответствующими идентификаторами.

Смежные вопросы