JavaScript n 次树
JavaScript nth degree tree
- 我需要将 parent 的点击 属性 更改为 true 如果点击的 children 全部为真。所以在这种情况下,ID - 14,15 已单击 属性 为真。因此,parent点击了 ID 11 必须为真。
- 如果 11,12,14,15 为真,则 4 必须为真。
let obj = {children:[
{
ID:1,
clicked: false,
children: [
{
ID:4,
clicked: false,
children: [
{
ID:11,
clicked: false,
children: [
{
ID:14,
clicked: true,
},
{
ID:15,
clicked: true,
}
]
},
{
ID:12,
clicked: false,
}
]
},
{
ID:5,
clicked: false,
}
]
}
]
}
您可以采用 depth-first search 算法,如果所有子项都包含 clicked: true
,则父项会得到更新。
const
update = object => {
if (!object.children) return object.clicked;
return object.clicked = object.children.every(update);
},
object = { children: [{ ID: 1, clicked: false, children: [{ ID: 4, clicked: false, children: [{ ID: 11, clicked: false, children: [{ ID: 14, clicked: true }, { ID: 15, clicked: true }] }, { ID: 12, clicked: false }] }, { ID: 5, clicked: false }] }] };
update(object);
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }
当您想改变输入时,Nina 给出了很好的答案。
这是创建新对象的简单方法:
const consolidate = ({clicked, children = [], ...rest}, _, __, kids = children .map (consolidate)) => ({
...rest,
clicked: clicked || (kids .length > 0) && kids .every (k => k .clicked),
...(kids .length ? {children: kids} : {})
})
const obj1 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: false}]}, {ID: 5, clicked: false}]}]};
// with 12 switched to `true`
const obj2 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: true}]}, {ID: 5, clicked: false}]}]};
console .log ('obj1', consolidate (obj1))
console .log ('obj2', consolidate (obj2))
.as-console-wrapper {max-height: 100% !important; top: 0}
我们在 children
上重复,如果有的话,然后重新生成评估每个 clicked
属性 的对象。
- 我需要将 parent 的点击 属性 更改为 true 如果点击的 children 全部为真。所以在这种情况下,ID - 14,15 已单击 属性 为真。因此,parent点击了 ID 11 必须为真。
- 如果 11,12,14,15 为真,则 4 必须为真。
let obj = {children:[
{
ID:1,
clicked: false,
children: [
{
ID:4,
clicked: false,
children: [
{
ID:11,
clicked: false,
children: [
{
ID:14,
clicked: true,
},
{
ID:15,
clicked: true,
}
]
},
{
ID:12,
clicked: false,
}
]
},
{
ID:5,
clicked: false,
}
]
}
]
}
您可以采用 depth-first search 算法,如果所有子项都包含 clicked: true
,则父项会得到更新。
const
update = object => {
if (!object.children) return object.clicked;
return object.clicked = object.children.every(update);
},
object = { children: [{ ID: 1, clicked: false, children: [{ ID: 4, clicked: false, children: [{ ID: 11, clicked: false, children: [{ ID: 14, clicked: true }, { ID: 15, clicked: true }] }, { ID: 12, clicked: false }] }, { ID: 5, clicked: false }] }] };
update(object);
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }
当您想改变输入时,Nina 给出了很好的答案。
这是创建新对象的简单方法:
const consolidate = ({clicked, children = [], ...rest}, _, __, kids = children .map (consolidate)) => ({
...rest,
clicked: clicked || (kids .length > 0) && kids .every (k => k .clicked),
...(kids .length ? {children: kids} : {})
})
const obj1 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: false}]}, {ID: 5, clicked: false}]}]};
// with 12 switched to `true`
const obj2 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: true}]}, {ID: 5, clicked: false}]}]};
console .log ('obj1', consolidate (obj1))
console .log ('obj2', consolidate (obj2))
.as-console-wrapper {max-height: 100% !important; top: 0}
我们在 children
上重复,如果有的话,然后重新生成评估每个 clicked
属性 的对象。