Вложенный фильтр JSON на основе объекта - PullRequest
0 голосов
/ 05 января 2020

У меня есть 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,
                }
              ]
            },
          ]
        }
      ]
    }
  ]

Значения проверенных значений получает истину и удаляет ложные проверенные значения из объекта массива столбцов. Что является лучшим подходом, если formValues ​​получают изменения, и результат изменится соответственно.

Ответы [ 3 ]

2 голосов
/ 05 января 2020

Вы можете строить новые объекты.

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; }
0 голосов
/ 05 января 2020

Есть ли конкретная c причина, по которой ваши поля расположены так? Почему проверенное поле? 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],
},
]

Для выполнения пакетных запросов к нескольким базам данных.

Предполагая, что для этого нет определенных c требований, просто объект структура, которая выглядит более или менее как treeMetaData, я думаю, было бы разумно переосмыслить то, как вы go делаете это. Это также сделает код, который вы пишете, чтобы сделать его чище.

0 голосов
/ 05 января 2020

Вы делаете это в 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>

    )

   }


Это возвращает ложь, как это должен. Я не говорю, что это отличный способ сделать то, что вы делаете, но он динамически возвращает ваше состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...