2 回答

TA貢獻1811條經驗 獲得超5個贊
這就是我的做法 - 首先根據.topic權限是否包含來過濾父數組,然后迭代具有數組的結果submenu并將子數組屬性重新分配給過濾后的版本:
const permissions = ['search', 'reports', 'whitelist'];
permissions.push('all');
const menus=[{text:"Navigation",link:"navigation",topic:"all"},{text:"Dictionary",link:"dict",topic:"src"},{text:"Services",link:"/services",submenu:[{text:"Check company",link:"/services/search",topic:"search"},{text:"Report statistic",link:"/services/reportstatistic",topic:"another-topic"},{text:"Report request",link:"/services/getrequestreport",topic:"another-topic-2"},{text:"Get whitelist",link:"/services/getresponsereport",topic:"whitelist"},{text:"Get data",link:"/services/requestdata",topic:"reports"}]}];
const filteredMenus = menus.filter(
item => !item.topic || permissions.includes(item.topic)
);
filteredMenus
.filter(item => item.submenu)
.forEach(item => item.submenu = item.submenu.filter(
subitem => permissions.includes(subitem.topic)
));
console.log(filteredMenus);

TA貢獻1811條經驗 獲得超4個贊
您可以使用Array.reduce處理menus數組,檢查主題是否all包含在 中permissions,并根據相同的規則過濾子菜單值:
const permissions = ['search', 'reports', 'whitelist'];
const menus=[{text:"Navigation",link:"navigation",topic:"all"},{text:"Dictionary",link:"dict",topic:"src"},{text:"Services",link:"/services",submenu:[{text:"Check company",link:"/services/search",topic:"search"},{text:"Report statistic",link:"/services/reportstatistic",topic:"another-topic"},{text:"Report request",link:"/services/getrequestreport",topic:"another-topic-2"},{text:"Get whitelist",link:"/services/getresponsereport",topic:"whitelist"},{text:"Get data",link:"/services/requestdata",topic:"reports"}]}];
const includeMenu = (menu) => menu.topic == 'all' || permissions.includes(menu.topic);
const newArr = menus.reduce((c, m) => {
if (m.submenu) {
submenus = m.submenu.filter(includeMenu);
if (submenus.length) {
c.push({
text: m.text,
link: m.link,
submenu: submenus
});
}
} else if (includeMenu(m)) {
c.push(m);
}
return c;
}, []);
console.log(newArr);
添加回答
舉報