有一個類別樹。它是一個物件陣列(在這種情況下,1 個物件具有 children 屬性。children 屬性是一個包含或不包含其他類別物件的陣列,依此類推)。每個物件還具有“禁用”屬性。它可以是真或假。起點是一些最底層的孩子“禁用”設定為真。在這種情況下,它們都設定為 true。任務是找到禁用的父 ID,如果其所有禁用的子項都設定為 true,則必須將其設定為 true。在這種特殊情況下,必須找到所有父 ID,因為所有最底層的子禁用都設定為 true。我的函式只回傳最低級別的父母。我究竟做錯了什么?
let parentIdsToDisable = [];
function findParentIdsToDisable(tree) {
tree.forEach((category) => {
if (category.children.length > 0) {
if (category.children.every((child) => child.disabled === true)) {
category.disabled = true;
parentIdsToDisable.push(category.id);
}
}
findParentIdsToDisable(category.children);
});
}
const categories = [
{
id: 69,
name: 'Прикраси',
key: 'prykrasy',
description: 'Прикраси',
disabled: false,
mpath: '69.',
children: [
{
id: 70,
name: 'Аксесуари',
key: 'aksesyary-dlya-prykras',
description: 'Аксесуари для прикрас',
disabled: true,
mpath: '69.70.',
children: []
},
{
id: 72,
name: 'Ювел?рн? вироби',
key: 'uvelirni-vyroby',
description: 'Ювел?рн? вироби',
disabled: false,
mpath: '69.72.',
children: [
{
id: 73,
name: 'Ср?бло',
key: 'vyroby-iz-sribla',
description: 'Ювел?рн? вироби ?з ср?бла',
disabled: true,
mpath: '69.72.73.',
children: []
}
]
},
{
id: 71,
name: 'Б?жутер?я',
key: 'bizhuteriya',
description: 'Б?жутер?я',
disabled: true,
mpath: '69.71.',
children: []
}
]
}
]
uj5u.com熱心網友回復:
id您需要先進行遞回呼叫,如果它本身被禁用,還需要保存當前專案。
function findParentIdsToDisable(tree) {
tree.forEach((category) => {
findParentIdsToDisable(category.children);
if (category.disabled) {
parentIdsToDisable.push(category.id);
}
if (category.children.length > 0) {
if (category.children.every((child) => child.disabled === true)) {
category.disabled = true;
parentIdsToDisable.push(category.id);
}
}
});
}
這會導致[ 70, 73, 72, 71, 69 ]您的資料。
uj5u.com熱心網友回復:
在檢查每個子項是否被禁用以查看是否禁用父項之前,您需要遞回并將邏輯應用于每個子項。
const categories=[{id:69,name:"Прикраси",key:"prykrasy",description:"Прикраси",disabled:!1,mpath:"69.",children:[{id:70,name:"Аксесуари",key:"aksesyary-dlya-prykras",description:"Аксесуари для прикрас",disabled:!0,mpath:"69.70.",children:[]},{id:72,name:"Ювел?рн? вироби",key:"uvelirni-vyroby",description:"Ювел?рн? вироби",disabled:!1,mpath:"69.72.",children:[{id:73,name:"Ср?бло",key:"vyroby-iz-sribla",description:"Ювел?рн? вироби ?з ср?бла",disabled:!0,mpath:"69.72.73.",children:[]}]},{id:71,name:"Б?жутер?я",key:"bizhuteriya",description:"Б?жутер?я",disabled:!0,mpath:"69.71.",children:[]}]}];
const disableObjectIfChildrenDisabled = (parent) => {
for (const child of parent.children ?? []) {
disableObjectIfChildrenDisabled(child);
}
if (parent.children?.every(child => child.disabled)) {
parent.disabled = true;
}
};
for (const parent of categories) {
disableObjectIfChildrenDisabled(parent);
}
console.log(categories);
uj5u.com熱心網友回復:
另一種方法是簡單地復制已應用更改的資料。這可能會也可能不會滿足您的需求,但它似乎比收集需要更改的 id 并在之后對其進行操作更簡單。
這是該想法的一個相當簡單的遞回實作:
const bubbleDisabled = (xs) =>
xs .map (({children, disabled, kids = bubbleDisabled (children), ...rest}) => ({
...rest,
disabled: disabled || (kids .length > 0 && kids .every (k => k .disabled)),
children: kids
}))
const categories = [{id: 69, name: "Прикраси", key: "prykrasy", description: "Прикраси", disabled: false, mpath: "69.", children: [{id: 70, name: "Аксесуари", key: "aksesyary-dlya-prykras", description: "Аксесуари для прикрас", disabled: true, mpath: "69.70.", children: []}, {id: 72, name: "Ювел?рн? вироби", key: "uvelirni-vyroby", description: "Ювел?рн? вироби", disabled: false, mpath: "69.72.", children: [{id: 73, name: "Ср?бло", key: "vyroby-iz-sribla", description: "Ювел?рн? вироби ?з ср?бла", disabled: true, mpath: "69.72.73.", children: []}]}, {id: 71, name: "Б?жутер?я", key: "bizhuteriya", description: "Б?жутер?я", disabled: true, mpath: "69.71.", children: []}]}]
console .log (bubbleDisabled (categories))
.as-console-wrapper {max-height: 100% !important; top: 0}
我們需要length檢查,因為every將(正確地)回傳true一個空陣列,并且我認為我們不想將其冒泡給它的父母。我們也使用disabled ||,因為我假設如果一個節點已經被禁用,我們不希望基于子節點啟用它。如果任一假設是錯誤的,您可以簡化 的分配disabled。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482921.html
標籤:javascript 数组 递归 嵌套的
上一篇:從遞回提取中解開所有承諾
