Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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_Json_Object - Fatal编程技术网

Javascript 基于对象筛选嵌套的JSON

Javascript 基于对象筛选嵌套的JSON,javascript,json,object,Javascript,Json,Object,我有一个JSON对象,希望根据该对象过滤JSON var fromValues = {table1: true, schema1: true, database: true, column1: true} const treeMetaData = [ { name : 'database', checked : false, schemas : [ { name : "schema1",

我有一个JSON对象,希望根据该对象过滤JSON

var fromValues  = {table1: true, schema1: true, database: true, column1: true} 



 const treeMetaData = [
    {
      name  :  'database',
      checked : false,
      schemas  : [
        {
          name  : "schema1",
          checked : false,
          tables : [
            {
              name  : "table1",
              checked : false,
              columns  : [
                {
                  name  : "column1",
                  checked : false,
                }, 
                {
                  name  : "column2",
                  checked : false,
                }
              ]
            },
          ]
        }
      ]
    }
  ] 
想要这样的输出吗

export const treeMetaData = [
    {
      name  :  'database',
      checked : true,
      schemas  : [
        {
          name  : "schema1",
          checked : true,
          tables : [
            {
              name  : "table1",
              checked : true,
              columns  : [
                {
                  name  : "column1",
                  checked : true,
                }
              ]
            },
          ]
        }
      ]
    }
  ]
checked的值已变为true,并从columns数组对象中删除false的checked值。
如果formValues发生变化,结果也会相应变化,那么更好的方法是什么

您可以构建新对象

函数过滤器(数组,过滤器){
return array.reduce((r,{name,checked,…o})=>{
if(filters[name])r.push(Object.assign(
{name,选中:true},
…Object.entries(o.map)([k,v])=>({
[k] :Array.isArray(v)
?过滤器(v,过滤器)
:v
}))
));
返回r;
}, []);
}
var-fromValues={table1:true,schema1:true,database:true,column1:true},
treeMetaData=[{name:'database',checked:false,模式:[{name:'schema1',checked:false,表:[{name:'table1',checked:false,列:[{name:'column1',checked:false},{name:'column2',checked:false}]},
结果=过滤器(treeMetaData,fromValues);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以构建新对象

函数过滤器(数组,过滤器){
return array.reduce((r,{name,checked,…o})=>{
if(filters[name])r.push(Object.assign(
{name,选中:true},
…Object.entries(o.map)([k,v])=>({
[k] :Array.isArray(v)
?过滤器(v,过滤器)
:v
}))
));
返回r;
}, []);
}
var-fromValues={table1:true,schema1:true,database:true,column1:true},
treeMetaData=[{name:'database',checked:false,模式:[{name:'schema1',checked:false,表:[{name:'table1',checked:false,列:[{name:'column1',checked:false},{name:'column2',checked:false}]},
结果=过滤器(treeMetaData,fromValues);
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
您是在React还是在JS框架中执行此操作?这可以帮助您管理状态。您可以将formValues转换为状态对象,然后在treeMetaData中为该状态属性的布尔值传递一个函数

例如,在React中:

import react, { useState } from 'react';


export default function Example() {

    const [state, setState] = useState({table1: false, table2: false})

    const treeMetaData = [
     {
      name: "table1",
      checked: (state.table1),
      whatever: []
     }
    ]


    return (
        <div>
            {treeMetaData[0].checked.toString()}
        </div>

    )

   }


import react,{useState}来自“react”;
导出默认函数示例(){
const[state,setState]=useState({table1:false,table2:false})
常数treeMetaData=[
{
名称:“表1”,
勾选:(说明表1),
无所谓:[]
}
]
返回(
{treeMetaData[0]。已选中。toString()}
)
}

这会像应该的那样返回false。我并不是说这是做任何事情的好方法,但它会动态地返回您的状态。

您是在React还是JS框架中这样做的?这可以帮助您管理状态。您可以将formValues转换为状态对象,然后在treeMetaData中为该状态属性的布尔值传递一个函数

例如,在React中:

import react, { useState } from 'react';


export default function Example() {

    const [state, setState] = useState({table1: false, table2: false})

    const treeMetaData = [
     {
      name: "table1",
      checked: (state.table1),
      whatever: []
     }
    ]


    return (
        <div>
            {treeMetaData[0].checked.toString()}
        </div>

    )

   }


import react,{useState}来自“react”;
导出默认函数示例(){
const[state,setState]=useState({table1:false,table2:false})
常数treeMetaData=[
{
名称:“表1”,
勾选:(说明表1),
无所谓:[]
}
]
返回(
{treeMetaData[0]。已选中。toString()}
)
}

这会像应该的那样返回false。我不是说这是做任何事情的好方法,但它会动态地返回您的状态。

是否有特定的原因让您的字段像这样排列?为什么选中字段?fromValues仅仅是一个带有布尔值的对象也没有什么意义。你会有假道具吗?可能不会

const filter = {
  database: 'database',
  schema: ['schema1'],
  table: ['table1'],
  column: ['column1'],
}
可能更有意义。您可以更进一步,并执行以下操作:

const filter = [
{
  database: 'database',
  schema: ['schema1'],
  table: ['table1'],
  column: ['column1'],
},
{
  database: 'database2',
  schema: ['schema2'],
  table: ['table2'],
  column: [column2],
},
]
用于对多个数据库执行批处理查询


假设您对此没有特定的要求,只是一个看起来或多或少像
treeMetaData
的对象结构,我认为重新思考如何进行这项工作是明智的。它还将使您为处理它而编写的代码更干净。

是否有特定的原因使您的字段如此排列?为什么选中字段?fromValues仅仅是一个带有布尔值的对象也没有什么意义。你会有假道具吗?可能不会

const filter = {
  database: 'database',
  schema: ['schema1'],
  table: ['table1'],
  column: ['column1'],
}
可能更有意义。您可以更进一步,并执行以下操作:

const filter = [
{
  database: 'database',
  schema: ['schema1'],
  table: ['table1'],
  column: ['column1'],
},
{
  database: 'database2',
  schema: ['schema2'],
  table: ['table2'],
  column: [column2],
},
]
用于对多个数据库执行批处理查询

假设您对此没有特定的要求,只是一个看起来或多或少像
treeMetaData
的对象结构,我认为重新思考如何进行这项工作是明智的。它还将使您为处理它而编写的代码更干净