2 回答

TA貢獻1797條經驗 獲得超4個贊
使用以下輔助方法,遍歷項目并構建所需的輸出。
1) 過濾器——給定一個數組,返回為真的名稱
2) hasGrandChild——給定對象是否有子對象,子對象是否有子對象。
const process = data => {
const filter = arr => arr.filter(x => x.checked).map(x => x.name);
const hasGrandChild = arr => arr.length > 0 && "children" in arr[0];
const output = {};
data.forEach(({ name, children }) => {
if (hasGrandChild(children)) {
const obj = {};
children.forEach(ch => (obj[ch.name] = filter(ch.children)));
output[name] = obj;
} else {
output[name] = filter(children);
}
});
return output;
};
var data = [
{
name: "Main Hobbies",
checked: false,
children: [
{
name: "Dance",
checked: false,
children: [
{
name: "Salsa",
checked: true
},
{
name: "Solo",
checked: false
}
]
},
{
name: "Sports",
checked: false,
children: [
{
name: "Cricket",
checked: true
}
]
}
]
},
{
name: "Game",
checked: false,
children: [
{
name: "PUBG",
checked: false
},
{
name: "Cricket",
checked: false
},
{
name: "Football",
checked: true
}
]
}
];
console.log(process(data));

TA貢獻1773條經驗 獲得超3個贊
您可以檢查子項是否不包含子項并返回一個名稱數組或使用選中的節點創建一個對象。
const
getObject = array => array.every(({ children }) => !children)
? array.reduce((r, { name, checked }) => checked ? [...(r || []), name] : r, undefined)
: array.reduce((r, { name, checked, children = [] }) => {
children = getObject(children);
if (checked || children) r[name] = children;
return r;
}, {}),
data = [{ name: "Main Hobbies", checked: false, children: [{ name: "Dance", checked: false, children: [{ name: "Salsa", checked: true }, { name: "Solo", checked: false }] }, { name: "Sports", checked: false, children: [{ name: "Cricket", checked: true }] }] }, { name: "Game", checked: false, children: [{ name: "PUBG", checked: false }, { name: "Cricket", checked: false }, { name: "Football", checked: true }] }],
result = getObject(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
添加回答
舉報