【问题标题】:LoDash - DeepFlatten array of objectsLoDash - DeepFlatten 对象数组
【发布时间】:2015-09-04 03:09:26
【问题描述】:

我有以下收藏。每个对象可能有一个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? 中做到这一点

【问题讨论】:

    标签: javascript collections lodash flatten


    【解决方案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;
    }
    

    然后给它你的第一个数组,第二个应该返回。

    【讨论】:

      【解决方案2】:

      试试:

      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>

      【讨论】:

        【解决方案3】:

        你可以试试:

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

        【讨论】:

        • 我知道这个功能。我知道如何在文档中使用 CTRL+F。仅提供链接不是答案。我的问题是如何让它在我的情况下工作。
        • 对不起,我没有仔细阅读你的问题,我再次更新我的答案。
        猜你喜欢
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 2015-07-10
        • 1970-01-01
        相关资源
        最近更新 更多