javascript - 根据某些属性过滤嵌套数组
问题描述
我有一个数组:
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
}]
}]
function removeFalseElem(arr) {
arr.forEach(element => {
if (Array.isArray(element.children) && element.children.length > 0) {
element.children = element.children.filter(e => {
return e.checked === true
});
element.children.map(e => {
delete e['id'], delete e['checked']
})
} else {
removeFalseElem(element.children);
}
delete element['id'], delete element['checked'];
});
}
removeFalseElem(data);
console.log(data);
我如何映射name
到key
和包含 where is . 应该包含,因为它已被检查。我只想颠倒这个问题的方法children
array
checked
true
Main hobies
Salsa
输出应该像
{
"Main Hobbies": { Dance: ["Salsa"], Sports: ["Cricket"] },
Game: ["Football"]
}
必须只保留checked:true
值
解决方案
使用以下辅助方法,遍历项目并构建所需的输出。
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));
推荐阅读
- php - PHP 使用用户先前保存的预选选项显示从数组值中多选
- javascript - Mongoose 查询查找并找到一个
- github - 使用 Github 管理 Mandrill 交易电子邮件
- android - 为什么我不能使用 AutoML VIsion TFLite 模型?
- swiftui - SwiftUI:Tabbar 的奇怪行为
- python - Pandas 在多列上使用应用功能进行扩展
- c++ - Array not initialized but includes curly brackets
- amazon-web-services - 如何让 Kinesis 使用 OIDC 令牌连接到 http 端点?
- javascript - TypeError:无法读取未定义的属性“参数”
- git - gbp buildpackage 出于某种原因包括主目录