Javascript 如何从嵌套的JSON对象获取检查值数组
我有一个嵌套的json,带有带有布尔值的check键。我只想在结果数组中为那些具有check为true的名称键值 示例JSONJavascript 如何从嵌套的JSON对象获取检查值数组,javascript,arrays,json,Javascript,Arrays,Json,我有一个嵌套的json,带有带有布尔值的check键。我只想在结果数组中为那些具有check为true的名称键值 示例JSON const treeMetaData = [ { name : 'database', checked : true, schemas : [ { name : "schema1", checked : true, tables : [ { name : "table
const treeMetaData = [
{
name : 'database',
checked : true,
schemas : [
{
name : "schema1",
checked : true,
tables : [
{
name : "table1",
checked : true,
columns : [
{
name : "column1",
checked : false,
},
{
name : "column2",
checked : true,
}
]
},
]
},
{
name : "schema2",
checked : true,
tables : [
{
name : "table2",
checked : true,
columns : [
{
name : "column4",
checked : true,
},
{
name : "column5",
checked : false,
}
]
},
]
},
]
}]
我需要的输出
["database", "schema1", "table1", "column2", "schema2", "table2", "column4"]
真的需要帮助并且需要优化的方法,因为这个树数据很大。看起来很简单,你试过写一些循环吗
var result = [];
treeMetaData.forEach(database => {
if(!database.checked){ return; }
result.push(database.name);
database.schemas.forEach(schema => {
if(!schema.checked){ return; }
result.push(schema.name);
schema.tables.forEach(table => {
if(!table.checked){ return; }
result.push(table.name);
table.columns.forEach(column => {
if(!column.checked){ return; };
result.push(column.name);
});
});
});
});
//result is now: ["database", "schema1", "table1", "column2", "schema2", "table2", "column4"]
看起来很简单,你试过写一些循环吗
var result = [];
treeMetaData.forEach(database => {
if(!database.checked){ return; }
result.push(database.name);
database.schemas.forEach(schema => {
if(!schema.checked){ return; }
result.push(schema.name);
schema.tables.forEach(table => {
if(!table.checked){ return; }
result.push(table.name);
table.columns.forEach(column => {
if(!column.checked){ return; };
result.push(column.name);
});
});
});
});
//result is now: ["database", "schema1", "table1", "column2", "schema2", "table2", "column4"]
筑巢是答案
const treeMetaData=[
{
名称:'数据库',
核对:对,
模式:[
{
名称:“方案1”,
核对:对,
表:[
{
名称:“表1”,
核对:对,
栏目:[
{
名称:“第1栏”,
勾选:假,
},
{
名称:“专栏2”,
核对:对,
}
]
},
]
},
{
名称:“schema2”,
核对:对,
表:[
{
名称:“表2”,
核对:对,
栏目:[
{
名称:“专栏4”,
核对:对,
},
{
名称:“第5栏”,
勾选:假,
}
]
},
]
},
]
}]
常量结果=[]
treeMetaData.forEach(项=>{
如果(项目[“已选中]){
结果.推送(项['name'])
让schemas=item['schemas']
schemas.forEach(schema=>{
如果(项目[“已选中]){
result.push(模式['name'])
let tables=schema['tables']
tables.forEach(table=>{
如果(表['checked']){
结果.推送(表['name'])
let columns=表['columns']
columns.forEach(column=>{
如果(列['选中]){
结果.推送(列['name'])
}
});
}
});
}
});
}
});
console.log(result)
嵌套就是答案
const treeMetaData=[
{
名称:'数据库',
核对:对,
模式:[
{
名称:“方案1”,
核对:对,
表:[
{
名称:“表1”,
核对:对,
栏目:[
{
名称:“第1栏”,
勾选:假,
},
{
名称:“专栏2”,
核对:对,
}
]
},
]
},
{
名称:“schema2”,
核对:对,
表:[
{
名称:“表2”,
核对:对,
栏目:[
{
名称:“专栏4”,
核对:对,
},
{
名称:“第5栏”,
勾选:假,
}
]
},
]
},
]
}]
常量结果=[]
treeMetaData.forEach(项=>{
如果(项目[“已选中]){
结果.推送(项['name'])
让schemas=item['schemas']
schemas.forEach(schema=>{
如果(项目[“已选中]){
result.push(模式['name'])
let tables=schema['tables']
tables.forEach(table=>{
如果(表['checked']){
结果.推送(表['name'])
let columns=表['columns']
columns.forEach(column=>{
如果(列['选中]){
结果.推送(列['name'])
}
});
}
});
}
});
}
});
console.log(result)
您可以使用递归,并获取具有数组值的属性,以便知道递归到何处:
const listNames=arr=>
arr.filter({checked})=>checked.map(obj=>{
让val=Object.values(obj.find)(val=>Array.isArray(val));
返回[obj.name].concat(val?列表名(val):[]);
}).flat()
const treeMetaData=[{name:'database',checked:true,schema:[{name:'schema1',checked:true,tables:[{name:'column1',checked:false,},{name:'column2',checked:true,},},{name:'schema2',checked:true,tables:[{name:'table2',checked:true,columns:[{name:'column4',选中:true,},{name:“column5”,选中:false,}]},]},]},]};
设res=列表名(treeMetaData);
控制台日志(res)代码>您可以使用递归,并获取具有数组值的属性,以便知道在何处递归:
const listNames=arr=>
arr.filter({checked})=>checked.map(obj=>{
让val=Object.values(obj.find)(val=>Array.isArray(val));
返回[obj.name].concat(val?列表名(val):[]);
}).flat()
const treeMetaData=[{name:'database',checked:true,schema:[{name:'schema1',checked:true,tables:[{name:'column1',checked:false,},{name:'column2',checked:true,},},{name:'schema2',checked:true,tables:[{name:'table2',checked:true,columns:[{name:'column4',选中:true,},{name:“column5”,选中:false,}]},]},]},]};
设res=列表名(treeMetaData);
控制台日志(res)代码>谢谢马修,谢谢你的快速回答!!!任何其他好方法,我有100000个键值对用于此操作。您可以将子forEach移动到if语句中,但我不确定未选中的父项是否可以有选中的子项(请参阅ahmeds答案)。不管怎样,我看没有其他办法。没有未经检查的家长没有未经检查的孩子更新,应该会更快。谢谢马修快速回答,谢谢!!!任何其他好方法,我有100000个键值对用于此操作。您可以将子forEach移动到if语句中,但我不确定未选中的父项是否可以有选中的子项(请参阅ahmeds答案)。不管怎样,我看没有其他办法。没有未检查的家长没有已检查的孩子更新,应该更快。为什么你会认为它不是?这可能不是绝对最快的,但它的优势是速度更快