【问题标题】:Flatten nested array of objects JS展平嵌套的对象数组JS
【发布时间】:2019-10-20 22:59:22
【问题描述】:

我有一个嵌套的对象数组,并且只想获取数组的子属性元素。这只是一个示例,实际数据将在数组中的单独索引中包含唯一的子属性。我只能遍历列表中的第一个数组。

这是我的实现:

const headers = [{
    id: "name1",
    title: "Name 1",
    children: [{
        title: "Children 1",
        child: [{
            title: "Child 1",
            onClick: "child1Click"
          },
          {
            title: "Child 2",
            onClick: "child2Click"
          }
        ]
      },
      {
        title: "CHildren 2",
        child: [{
            title: "Child 3",
            id: "child3Click"
          },
          {
            title: "Child 4",
            id: "child4Click"
          }
        ]
      }
    ]
  },
  {
    id: "name2",
    title: "Name 2",
    children: [{
        title: "Children 3",
        child: [{
            title: "Child 5",
            onClick: "child5Click"
          },
          {
            title: "Child 6",
            onClick: "child6Click"
          }
        ]
      },
      {
        title: "CHildren 4",
        child: [{
            title: "Child 7",
            id: "child7Click"
          },
          {
            title: "Child 8",
            id: "child8Click"
          }
        ]
      }
    ]
  },
  {
    id: "name3",
    title: "Name 3"
  },
  {
    id: "name4",
    title: "Name 4"
  }
]

console.log(_.flattenDeep(_.map(_.compact(_.map(headers, item => item.children))[0], item1 => item1.child)))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

预期输出:

[
  {
    "title": "Child 1",
    "onClick": "child1Click"
  },
  {
    "title": "Child 2",
    "onClick": "child2Click"
  },
  {
    "title": "Child 3",
    "id": "child3Click"
  },
  {
    "title": "Child 4",
    "id": "child4Click"
  },
  {
    "title": "Child 5",
    "onClick": "child5Click"
  },
  {
    "title": "Child 6",
    "onClick": "child6Click"
  },
  {
    "title": "Child 7",
    "id": "child7Click"
  },
  {
    "title": "Child 8",
    "id": "child8Click"
  }
]

请指教。

编辑:我能够使用 console.log(.flattenDeep(.map(.flattenDeep(.compact(_.map(headers, '孩子'))),'孩子')))

但是有没有优化的版本可以做同样的事情?谢谢

【问题讨论】:

    标签: javascript arrays object lodash


    【解决方案1】:

    _.flatMap()获取children,过滤掉undefined的值,然后再次使用_.flatMap()得到child属性的值:

    const headers = [{"id":"name1","title":"Name 1","children":[{"title":"Children 1","child":[{"title":"Child 1","onClick":"child1Click"},{"title":"Child 2","onClick":"child2Click"}]},{"title":"CHildren 2","child":[{"title":"Child 3","id":"child3Click"},{"title":"Child 4","id":"child4Click"}]}]},{"id":"name2","title":"Name 2","children":[{"title":"Children 3","child":[{"title":"Child 5","onClick":"child5Click"},{"title":"Child 6","onClick":"child6Click"}]},{"title":"CHildren 4","child":[{"title":"Child 7","id":"child7Click"},{"title":"Child 8","id":"child8Click"}]}]},{"id":"name3","title":"Name 3"},{"id":"name4","title":"Name 4"}]
    
    const result = _.flatMap(_.compact(_.flatMap(headers, 'children')), 'child')
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

    如果您使用的是 lodash/fp,您可以使用 _.flow() 生成更具可读性的函数:

    const fn = _.flow(
      _.flatMap('children'),
      _.compact,
      _.flatMap('child')
    )
    
    const headers = [{"id":"name1","title":"Name 1","children":[{"title":"Children 1","child":[{"title":"Child 1","onClick":"child1Click"},{"title":"Child 2","onClick":"child2Click"}]},{"title":"CHildren 2","child":[{"title":"Child 3","id":"child3Click"},{"title":"Child 4","id":"child4Click"}]}]},{"id":"name2","title":"Name 2","children":[{"title":"Children 3","child":[{"title":"Child 5","onClick":"child5Click"},{"title":"Child 6","onClick":"child6Click"}]},{"title":"CHildren 4","child":[{"title":"Child 7","id":"child7Click"},{"title":"Child 8","id":"child8Click"}]}]},{"id":"name3","title":"Name 3"},{"id":"name4","title":"Name 4"}]
    
    const result = fn(headers)
    
    console.log(result)
    <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

    将 lodash 与 _.flow()_.partialRight() 一起使用:

    const pr = _.partialRight;
    
    const fn = _.flow(
      pr(_.flatMap, 'children'),
      _.compact,
      pr(_.flatMap, 'child')
    )
    
    const headers = [{"id":"name1","title":"Name 1","children":[{"title":"Children 1","child":[{"title":"Child 1","onClick":"child1Click"},{"title":"Child 2","onClick":"child2Click"}]},{"title":"CHildren 2","child":[{"title":"Child 3","id":"child3Click"},{"title":"Child 4","id":"child4Click"}]}]},{"id":"name2","title":"Name 2","children":[{"title":"Children 3","child":[{"title":"Child 5","onClick":"child5Click"},{"title":"Child 6","onClick":"child6Click"}]},{"title":"CHildren 4","child":[{"title":"Child 7","id":"child7Click"},{"title":"Child 8","id":"child8Click"}]}]},{"id":"name3","title":"Name 3"},{"id":"name4","title":"Name 4"}]
    
    const result = fn(headers)
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

    【讨论】:

    • 谢谢哥们。我有一个类似的代码来完成以下工作。我确实使用 _.compact 来获得真实值。有没有其他方法可以做到这一点?
    • 我其实更喜欢紧凑型。好久没用过那个了。请参阅我的 lodash/fp 解决方案。
    • 第二个解决方案看起来很简洁。我会检查一下。谢谢老兄。
    • 注意lodash/fp的使用。可以使用 lodash 完成,但需要 partialRight。
    • 你介意用 partialRight 给我一个解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2016-05-18
    • 2021-05-14
    • 2013-11-06
    • 1970-01-01
    • 2018-10-24
    • 2020-07-11
    相关资源
    最近更新 更多