根据对象过滤嵌套的JSON

时间:2020-01-05 18:08:55

标签: javascript json object

我有一个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更改并且结果将相应更改,哪种方法更好?

3 个答案:

答案 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的对象结构,我认为重新考虑如何执行此操作是明智的。还将使您编写的代码更加干净。

相关问题