首页 > 解决方案 > 如何基于对象数组中的属性进行多级过滤

问题描述

我有一个对象数组。每个对象都有hasPermission属性和children属性。children 属性也是一个对象数组,每个对象都有hasPermission属性。我的数组是这样的:

const navigationMenus = [
  {
    hasPermission: false,
    name: 'Main',
    type: 'section',
    children: [
      {
        hasPermission: true,
        name: 'Test',
        type: 'item',
        link: '/test'
      }
    ]
  },
  {
    hasPermission: true,
    name: 'Master',
    type: 'section',
    children: [
      {
        hasPermission: true,
        name: 'Operator Group',
        type: 'item',
        link: '/operator-group'
      },
      {
        hasPermission: false,
        name: 'Operation Group',
        type: 'item',
        link: '/operation-group'
      }
    ]
  }
];

基于hasPermission属性,我想要另一个数组,它只包含那些hasPermission属性为真的对象。我尝试过这种方法。

const permittedNavigationMenus = []
for (let i = 0; i < navigationMenus.length; i++) {
  const section = navigationMenus[i];
  if (section.hasPermission) {
    const permittedSection = {
      name: section.name,
      type: section.type,
      children: []
    }
    for (let j = 0; j < section.children.length; j++) {
      const item = section.children[j]
      if (item.hasPermission) {
        permittedSection.children.push(item)
      }
    }
    permittedNavigationMenus.push(permittedSection)
  }
}
console.log(JSON.stringify(permittedNavigationMenus, null, 2))

有没有更好的解决方案?

标签: javascript

解决方案


一个简单的递归函数可以做到这一点:

const navigationMenus = 
  [ { hasPermission: false, name: 'Main', type: 'section', children: 
      [ { hasPermission: true, name: 'Test', type: 'item', link: '/test' } ] 
    } 
  , { hasPermission: true, name: 'Master', type: 'section', children: 
      [ { hasPermission: true, name: 'Operator Group', type: 'item', link: '/operator-group' } 
      , { hasPermission: false, name: 'Operation Group', type: 'item', link: '/operation-group' } 
  ] } ] 

const navigationMenusTrue = []

function runArray(arr,parent)
  {
  arr.forEach(({children,...info}) => 
    {
    if (info.hasPermission)
      {
      let newRow = {...info}
      parent.push(newRow)
      if (children)
        {
        let xChilds = []
        newRow.children = xChilds
        runArray(children,xChilds)
        }
      }  
    })
  }

runArray(navigationMenus,navigationMenusTrue)

console.log( navigationMenusTrue )
.as-console-wrapper {max-height: 100%!important;top:0 }


推荐阅读