简体   繁体   English

展平嵌套的对象数组JS

[英]Flatten nested array of objects JS

I have a nested array of objects and want to get only the child property elements of an array.我有一个嵌套的对象数组,并且只想获取数组的子属性元素。 This is just an example and the actual data will include a unique children property in separate indices in the array.这只是一个示例,实际数据将在数组中的单独索引中包含唯一的子属性。 I am only able to traverse the first array in the list.我只能遍历列表中的第一个数组。

Here is my implementation:这是我的实现:

 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>

Expected Output:预期 Output:

[
  {
    "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"
  }
]

Please advice.请指教。

Edit: I was able to get the required result using console.log( .flattenDeep( .map( .flattenDeep( .compact(_.map(headers, 'children'))), 'child')))编辑:我能够使用 console.log( .flattenDeep( .map( .flattenDeep( .compact(_.map(headers, 'children'))), 'child'))) 获得所需的结果

But is there an optimized version for doing the same?但是是否有一个优化版本可以做同样的事情? Thanks谢谢

Get the children with _.flatMap() , filter out the undefined values, and then use _.flatMap() again to get the values of the child property:使用_.flatMap() () 获取子属性,过滤掉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>

If you're using lodash/fp, you can generate a more readable function with _.flow() :如果您使用 lodash/fp,您可以使用_.flow()生成更具可读性的 function:

 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>

Using lodash with _.flow() and _.partialRight() :将 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM