繁体   English   中英

从嵌套的对象数组中提取所有特定属性

[英]Extract all specific properties from a nested array of objects

我有一个嵌套的对象数组。 我想获得一个 object,它只为我提供 onClick 属性作为键,值作为 null。 我能够导航到第一级,但我无法进一步向下导航。 我该怎么做 go 向前做呢?

 const headers = [{ id: 'title1', title: 'Title 1', children: [ { title: 'Children 1', child: [ { title: 'Child 1', id: 'child1Id', onClick: 'child1Click', url: '/child1' }, { title: 'Child 2', id: 'child2Id', onClick: 'child2Click' } ] }, { title: 'Children 2', child: [ { title: 'Child 3', id: 'child3Id', onClick: 'child3Click', }, { title: 'Child 4', id: 'child4Id', onClick: 'child4Click' } ] } ] }, { id: 'title2', title: 'Title 2', privilege: '', children: [{ title: 'Children 3', privilege: '', child: [{ title: 'Child 5', id: 'child5Id', onClick: 'child3Click', url: '/child5', privilege: '' }, { title: 'Child 6', id: 'child6Id', onClick: 'child6Click', url: '/child6', privilege: '' } ] }, { title: 'Children 4', privilege: '', child: [{ title: 'Child 7', id: 'child7Id', onClick: 'child7Click', url: '/child7', privilege: '' }, { title: 'Child 8', id: 'child8Id', onClick: 'child8Click', url: '/child8', privilege: '' } ] } ] } ]; const routesMap = ({ onClick, children }) => (onClick? { [onClick]: null }: _.flatMap(children, routesMap)); const routeStates = _.assign({}, ..._.flatMap(headers, routesMap)); console.log(routeStates)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

预期 Output:

  {
      child1Click: null,
      child2Click: null,
      child3Click: null,
      child4Click: null,
      child5Click: null,
      child6Click: null,
      child7Click: null,
      child8Click: null,
  }

请指教。 非常感谢任何帮助。

使用 vanilla JS,您可以使用 3 个嵌套的 map 循环来获取onClick值,并返回一个 object 值作为属性。 使用Array.flat()转换为单个数组,并传播到Object.assign()得到一个 object。

 const fn = headers => Object.assign({}, ...headers.map(({ children }) => children.map(({ child }) => child.map(({ onClick }) => ({ [onClick]: null }))) ) // extract onClick values.flat(Infinity) // flatten to a single array ) const headers = [{"id":"title1","title":"Title 1","children":[{"title":"Children 1","child":[{"title":"Child 1","id":"child1Id","onClick":"child1Click","url":"/child1"},{"title":"Child 2","id":"child2Id","onClick":"child2Click"}]},{"title":"Children 2","child":[{"title":"Child 3","id":"child3Id","onClick":"child3Click"},{"title":"Child 4","id":"child4Id","onClick":"child4Click"}]}]},{"id":"title2","title":"Title 2","privilege":"","children":[{"title":"Children 3","privilege":"","child":[{"title":"Child 5","id":"child5Id","onClick":"child3Click","url":"/child5","privilege":""},{"title":"Child 6","id":"child6Id","onClick":"child6Click","url":"/child6","privilege":""}]},{"title":"Children 4","privilege":"","child":[{"title":"Child 7","id":"child7Id","onClick":"child7Click","url":"/child7","privilege":""},{"title":"Child 8","id":"child8Id","onClick":"child8Click","url":"/child8","privilege":""}]}]}] const routeStates = fn(headers) console.log(routeStates)

使用 lodash 你可以使用_.flatMapDeep()而不是Array.flat()

 const fn = headers => Object.assign({}, ... _.flatMapDeep(headers, ({ children }) => _.map(children, ({ child }) => _.map(child, ({ onClick }) => ({ [onClick]: null }))) ) // extract onClick values and flatte ) const headers = [{"id":"title1","title":"Title 1","children":[{"title":"Children 1","child":[{"title":"Child 1","id":"child1Id","onClick":"child1Click","url":"/child1"},{"title":"Child 2","id":"child2Id","onClick":"child2Click"}]},{"title":"Children 2","child":[{"title":"Child 3","id":"child3Id","onClick":"child3Click"},{"title":"Child 4","id":"child4Id","onClick":"child4Click"}]}]},{"id":"title2","title":"Title 2","privilege":"","children":[{"title":"Children 3","privilege":"","child":[{"title":"Child 5","id":"child5Id","onClick":"child3Click","url":"/child5","privilege":""},{"title":"Child 6","id":"child6Id","onClick":"child6Click","url":"/child6","privilege":""}]},{"title":"Children 4","privilege":"","child":[{"title":"Child 7","id":"child7Id","onClick":"child7Click","url":"/child7","privilege":""},{"title":"Child 8","id":"child8Id","onClick":"child8Click","url":"/child8","privilege":""}]}]}] const routeStates = fn(headers) console.log(routeStates)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

尝试循环访问它并访问它试试这个,因为它是一个 object...

for ( let i = 0; i < headers.length; i++ ) {

   for (let j = 0; j < headers[i].children.length; j++ ) {

     for (let k = 0; k < headers[i].children[j].child.length; j++ ) {

       console.log( headers[i].children[j].child[k].onClick);

    }

  }

}

它将打印如下...

  child1Click,
  child2Click,
  child3Click,
  child4Click,
  child5Click,
  child6Click,
  child7Click,
  child8Click

如果你想将所有 childClick 设置为 null 尝试添加这个..

console.log( headers[i].children[j].child[k].onClick: null);

我希望它有帮助

我借用了一个我在这里找到的解决方案来创建这个:

var headers = [
    //...
];
var newObj = {};

function iterate(obj) {
    Object.keys(obj).forEach(key => {

    if (key === 'onClick') {
        newObj[obj[key]] = 'null';
    }

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
        }
    })
}

iterate(headers);
console.log(newObj);

暂无
暂无

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

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