Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从嵌套的JSON对象获取检查值数组_Javascript_Arrays_Json - Fatal编程技术网

Javascript 如何从嵌套的JSON对象获取检查值数组

Javascript 如何从嵌套的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

我有一个嵌套的json,带有带有布尔值的check键。我只想在结果数组中为那些具有check为true的名称键值

示例JSON

 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答案)。不管怎样,我看没有其他办法。没有未检查的家长没有已检查的孩子更新,应该更快。为什么你会认为它不是?这可能不是绝对最快的,但它的优势是速度更快