我有一个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数组对象中删除了错误的Checked值。 如果formValues更改并且结果将相应更改,哪种方法更好?
答案 0 :(得分:2)
您可以构建新对象。
function filter(array, filters) {
return array.reduce((r, { name, checked, ...o }) => {
if (filters[name]) r.push(Object.assign(
{ name, checked: true },
...Object.entries(o).map(([k, v]) => ({
[k]: Array.isArray(v)
? filter(v, filters)
: v
}))
));
return r;
}, []);
}
var fromValues = { table1: true, schema1: true, database: true, column1: true },
treeMetaData = [{ name: 'database', checked: false, schemas: [{ name: "schema1", checked: false, tables: [{ name: "table1", checked: false, columns: [{ name: "column1", checked: false }, { name: "column2", checked: false }] }] }] }],
result = filter(treeMetaData, fromValues);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分: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>
)
}
这将返回应有的假值。我并不是说这是做任何事情的好方法,但它确实会动态返回您的状态。
答案 2 :(得分:0)
您是否有特定原因布置您的字段?为什么选中字段? 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
的对象结构,我认为重新考虑如何执行此操作是明智的。还将使您编写的代码更加干净。