【发布时间】:2018-06-22 18:07:00
【问题描述】:
我已经找了一段时间的例子,但我找不到任何类似的东西,而且我对过滤器功能的理解也很缺乏,任何帮助都非常非常感谢。我正在尝试从嵌套项目标签 === 未定义的对象中删除元素。
this.items = [ // main MenuItem[] object (contains entire menu)
{
label: this.headingLabel, visible: this.booleanPipe.transform(this.labelVisible),
items: [ // headings of the menu sit in navbar, a MenuItem[][] two dimensional array
[
{
label: this.subMenuLabel, visible: this.booleanPipe.transform(this.labelVisible), separator: true,
items: [ // items that need to be removed if they are undefined, another MenuItem[] object, potentially need to remove only some of its elements
{ label: this.subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: this.subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: undefined, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: this.subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: this.subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: undefined, visible: this.booleanPipe.transform(this.labelVisible) }
]
},
],
[
{
label: subMenuLabel, visible: this.booleanPipe.transform(this.labelVisible), separator: true,
items: [
{ label: subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) },
{ label: subMenuItemLabel, visible: this.booleanPipe.transform(this.labelVisible) }
]
}
]
]
},
...
我能够从主对象中删除标签未定义的元素:
this.items = this.items.filter(obj => obj.label !== undefined);
但我无法弄清楚如何嵌套另一个过滤器、映射或查找......不太确定如何......能够访问嵌套项目并检查它们的标签是否未定义并删除它们!
EDIT1: this.items 对象是一个 MenuItem[] 数组。 MenuItem 是一个 PrimeNG 类。它有如下定义:
export interface MenuItem {
label?: string;
icon?: string;
command?: (event?: any) => void;
url?: string;
routerLink?: any;
queryParams?: { [k: string]: any };
items?: MenuItem[]|MenuItem[][];
expanded?: boolean;
disabled?: boolean;
visible?: boolean;
target?: string;
routerLinkActiveOptions?: any;
separator?: boolean;
badge?: string;
badgeStyleClass?: string;
style?:any;
styleClass?:string;
title?: string;
id?: string;
automationId?: any;
}
为了构建 MegaMenu 组件,您必须在 typescript 文件中定义您的结构,我无法偏离这一点,因为这不是我的决定。我也无法从 PrimeNG 的库中选择另一个菜单组件。我希望我的进一步解释有所帮助,如果我一开始不够清楚,对不起。我想专注于这个问题,而不会使问题过于复杂。
this.items = [ //main MenuItem[] contains the entire menu
{
label: label1, visible: this.booleanPipe.transform(this.labelVisible),
items: [ //nested MenuItem[][] contains the headings and each individual menu list for headings
[
{
label: this.label2, visible: this.booleanPipe.transform(this.labelVisible), separator: true,
items: [ //another MenuItem[] (contains dropdowns, subheadings etc)
{ label: this.label3, visible: this.booleanPipe.transform(this.labelVisible) },
希望能够移除最内层嵌套的 items 对象的主要原因是,即使您使 Angular 可见,它仍然会在菜单中呈现一个空白点:false。这使得菜单看起来非常非常丑陋和支离破碎。
感谢您迄今为止提出的所有建议并帮助弥补我在知识上的一些差距,我将在明天尝试实施所有建议的想法并进行报告。我希望我的修改能更清晰。
编辑: 我今天要签收,最近一次尝试过,但没有成功:
for (let item of this.items) {
for (let subItem of item.items) {
subItem = (subItem as (MenuItem)[]).filter(obj => obj.label !== undefined);
}
}
【问题讨论】:
-
这是最大深度,还是数组嵌套更深?
-
@bambam 这是最大深度,只是更长,我省略了一些长度以免多余。
标签: javascript angular primeng