javascript - 如何基于对象数组中的属性进行多级过滤
问题描述
我有一个对象数组。每个对象都有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))
有没有更好的解决方案?
解决方案
一个简单的递归函数可以做到这一点:
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 }
推荐阅读
- database - FMX LiveBindings CustomFormat IfThen 具有三个或更多结果
- java - 如何在 Spring 或 EE 上重写 Guice Interface DI Injector.getInjector().getInstance(Interface.class)
- php - 抽象静态方法中的实例子类
- python - 尝试在 for 循环中使用列表索引
- javascript - TWEENJS 奇怪的悠悠球threejs
- excel - 有什么方法可以在 PowerQuery 中移动“单元格”?
- java - 如果用户退出,我如何允许用户更改其密码?
- php - 多个复数条件翻译
- javascript - 反应:将多个过滤器应用于数组
- javascript - 如何仅在发生 2 个 DOM 事件时执行 javascript 代码?