Javascript 基于对象筛选嵌套的JSON
我有一个JSON对象,希望根据该对象过滤JSONJavascript 基于对象筛选嵌套的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",
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
的对象结构,我认为重新思考如何进行这项工作是明智的。它还将使您为处理它而编写的代码更干净