簡體   English   中英

LoDash - DeepFlatten對象數組

[英]LoDash - DeepFlatten array of objects

我有以下收藏。 每個對象可能有一個children對象數組,可能有一個children對象數組,依此類推......

[
  {
    "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?這樣做lodash.js?

嘗試:

 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> 

您可以使用遞歸函數來調用每個子元素並將其連接在同一個數組中:

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

然后給它你的第一個數組,第二個應該返回。

你可以試試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM