【问题标题】:How to filter out values from a nested objects in javascript如何从javascript中的嵌套对象中过滤掉值
【发布时间】:2019-05-07 09:46:16
【问题描述】:

我需要访问 JavaScript 对象数组的属性并将其转换为新数组。数组采用这样的形式。

Company = [
    { 
      name:"A", 
      items:[
          { name:"AA",
            items:[
             { name:"AAA",
               items:[...]
             },
             { name:"AAB",
               items:[...]
             }
          ]
       },
        { name:"AB",items:[{},{}]}
       ]
    },
    {
      name:"B", items:[{ name:"BA",items:[{...},{...}]},{ name:"BB",items:[{...},{...}]}]
    },
    {
      name:"C", items:[{ name:"CA",items:[{...},{...}]},{ name:"CB",items:[{...},{...}]}]
    }
........
]; 

我需要把它转换成这样的结构。

Company = [
    { title: 'A',
      children: [
         { title: 'AA',
            children: [{ title: 'AAA',children: [..] }] 
         },
         { title: 'AB', children: [{ title: 'ABA',children: [..] }
       ]
    },
    { title: 'B',
      children: [
         { title: 'BA',
            children: [{ title: 'BAA',children: [..] }] 
         },
         { title: 'BB', children: [{ title: 'BBA',children: [..] }
       ]
    },
  .........
   ]

我尝试使用 ES6 Map、Reducer、Filter 和 lodash 来转换数组,但我做不到。关于如何实现这一目标的任何想法?这是我到目前为止尝试过的内容

function checkitems(data){
  if (typeof data.items !== "undefined" || data.items.length > 0) {

    data.items.map(dept => {
      return {
        title: dept.name,
        children: checkitems(dept)
      };
    });
  }
  return;
    }

    company.map((dept)=>{
       return {
         title:dept.name,
         children: checkitems(dept)
       }
    });

【问题讨论】:

  • 请提供使用 Map reduce 和 filter 的代码以及您尝试过的代码。
  • 只要有“n”层children,你就需要递归来解决这个问题
  • @DTul 我更新了我的问题
  • @messerbill 我用递归更新了我的问题

标签: javascript recursion ecmascript-6 lodash


【解决方案1】:

您可以像这样递归更新items

const Company=[{name:"A",items:[{name:"AA",items:[{name:"AAA",},{name:"AAB",}]},{name:"AB"}]},{name:"B",items:[{name:"BA",items:[{name:"BAA",},{name:"BAB",}]},{name:"BB",}]},{name:"C",items:[{name:"CA",},{name:"CB",}]}];

function trasnform(array) {
  return array.map(({ name , items }) => {
    const obj = { title: name }
    if(items)
      obj.children = trasnform(items);
      
    return obj;
  })
}

console.log(trasnform(Company))

【讨论】:

    【解决方案2】:

    使用解构赋值和默认参数 -

    const transform = (arr = []) =>
      arr.map(({ name, items = [] }) =>
        ({ title: name, children: transform(items) })
      )
    

    使用相互递归分解-

    const transform1 = ({ name, items = [] }) =>
      ({ title: name, children: transform(items) })
    
    const transform = (arr = []) =>
      arr.map(transform1)
    

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 2022-01-24
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多