2015-06-18 4 views
3

У меня есть следующая коллекция. Каждый объект может иметь children массив объектов, которые могут иметь children массив объектов и так далее ...LoDash - массив объектов DeepFlatten

[ 
    { 
    "name": "John", 
    "age": 24, 
    "children": [ 
     { 
     "name": "Jack", 
     "age": 53, 
     "children": [ 
      { 
      "name": "Jenny", 
      "age": 88 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "name": "George", 
    "age": 45, 
    "children": [ 
     { 
     "name": "Chris", 
     "age": 38, 
     "children": [ 
      { 
      "name": "Nick", 
      "age": 35, 
      "children": [ 
       { 
       "name": "Maria", 
       "age": 63 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Я хочу, чтобы рекурсивно придавить коллекцию для того, чтобы иметь следующий результат:

[ 
    { 
    "name": "John", 
    "age": 24 
    }, 
    { 
    "name": "Jack", 
    "age": 53 
    }, 
    { 
    "name": "Jenny", 
    "age": 88 
    }, 
    { 
    "name": "George", 
    "age": 45 
    }, 
    { 
    "name": "Chris", 
    "age": 38 
    }, 
    { 
    "name": "Nick", 
    "age": 35 
    }, 
    { 
    "name": "Maria", 
    "age": 63 
    } 
] 

Как я могу сделать это в lodash.js?

ответ

4

Try:

var data=[{"name":"John","age":24,"children":[{"name":"Jack","age":53,"children":[{"name":"Jenny","age":88}]}]},{"name":"George","age":45,"children":[{"name":"Chris","age":38,"children":[{"name":"Nick","age":35,"children":[{"name":"Maria","age":63}]}]}]}] 
 

 
function getPeople(persons){ 
 
    var result = []; 
 
    _.each(persons, function(person){ 
 
    result.push({name: person.name, age: person.age}); 
 
    person.children && (result = _.union(result,getPeople(person.children))) 
 
    }); 
 
    return result 
 
} 
 

 
document.write(JSON.stringify(getPeople(data)))
<script src="https://lodash.com/_js/lodash.js"></script>

1

Вы можете сделать это с рекурсивной функцией, называющая себя на каждом элементе детей и конкатенации его в том же массиве:

function listPeople(list) { 
    var people = []; 

    for (var person in list) { 
     people.push({name: person.name, age: person.age}); 
     if (person.children) { 
       var children = listPeople(person.children); 
       people = people.concat(children); 
     } 
    } 

    return people; 
} 

Затем просто дайте ему свой первый массив, а второй должен быть возвращен.

0

Вы можете попробовать:

var _ = require('lodash'); 
var a = [ 
    { 
     "name": "John", 
     "age": 24, 
     "children": [ 
      { 
       "name": "Jack", 
       "age": 53, 
       "children": [ 
        { 
         "name": "Jenny", 
         "age": 88 
        } 
       ] 
      } 
     ] 
    }, 
    { 
     "name": "George", 
     "age": 45, 
     "children": [ 
      { 
       "name": "Chris", 
       "age": 38, 
       "children": [ 
        { 
         "name": "Nick", 
         "age": 35, 
         "children": [ 
          { 
           "name": "Maria", 
           "age": 63 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 
]; 

var list = []; 
function filter(arr, items){ 
    if(_.isArray(arr) && _.isArray(items)){ 
     _.forEach(items, function(item){ 
      if(item.name && item.age) { 
       arr.push({ 
        name: item.name, 
        age: item.age 
       }); 
      } 
      if(item.children && _.isArray(item.children)){ 
       filter(arr,item.children); 
      } 
     }); 
    } 
} 

filter(list, a); 
console.log(list); 
+0

Я знаю функции. Я знаю, как CTRL + F в документах. И предоставление только ссылки не является ответом. Мой вопрос заключался в том, как заставить его работать в моем случае. –

+0

Извините, я не внимательно прочитал ваш вопрос, я снова обновляю свой ответ. –