Отображение зависимостей в структуре JSON

#javascript #json #database #data-structures #structure

#javascript #json #База данных #структуры данных #структура

Вопрос:

В настоящее время я создаю веб-инструмент, который позволяет пользователю генерировать пакет опций в виде строки. Чтобы выбрать, какие параметры он хочет, он использует форму с разными входными данными (радио, флажок), которая генерируется из a dictionary.json , который в настоящее время содержит все доступные параметры и их коды в следующем формате (может быть изменен):

 [

    {
        "id": 0001,
        "title":"foo",
        "type":"radio",
        "options":[
            {
                "bar":"",
                "foo":"489",
                "foobar":"489 490"
            }
        ]
    },
    {
        "id": 0002,
        "title":"something",
        "type":"check",
        "options":[
            {
                "everything":"M016",
                "evenmore":"M139"
            }
        ]
    },

    [...]
 

Как вы можете видеть, это в основном небольшая база данных. Проблема в том, что параметры зависят друг от друга, поэтому, если foo это foobar так, это может определить, что something это определенно evenmore и НЕ может быть изменено everything . Как бы я сопоставил эти зависимости в, чтобы сгенерированная форма могла надежно выделять параметры, которые определяются другими вариантами dictionary.json ?

Структура должна быть гибкой, чтобы можно было вставлять новые зависимости и надежно генерировать новую форму или проверять существующие выходные данные на соответствие им. Также могут быть параметры, которые зависят от нескольких других параметров. Я не могу придумать разумный способ сохранения этих зависимостей, и мне интересно, подходит ли здесь формат JSON.

Любые советы или идеи приветствуются. Спасибо!

Комментарии:

1. Я бы рекомендовал взглянуть на Joi: npmjs.com/package/@hapi/joi . Вы можете проверить практически любой объект JSON с помощью действительно сложных и расширяемых схем joi.

2. @AnandUndavia спасибо за ваш комментарий. Я не уверен, как это будет применяться здесь, поскольку единственная проверка, которая выполняется, — это если набор правил (строка) «разрешен», как в «он не содержит правил, которые исключают друг друга»

3. Являются ли параметры эксклюзивными для одного объекта или для "type" ? Например. может ли опция "bar" отображаться для других объектов и / или типов?

Ответ №1:

Вы можете попытаться сохранить каждый параметр как один объект, в котором хранятся все параметры, которые будут исключены, если этот параметр будет выбран. Таким образом, ваш JSON может выглядеть следующим образом:

 [
    {
        "id": 0001,
        "title":"foo",
        "type":"radio",
        "options":[
            {
                "bar":"",
                "excludes": []
            },
            {
                "foo":"489",
                "excludes": []
            },
            {
                "foobar":"489 490",
                "excludes": [
                    {
                        "id": 0002,
                        "options": [
                            "everything"
                        ],
                    },
                    {
                        "id": 0003,
                        "options": [
                            "apple",
                            "cherry"
                        ],
                    },
                ]
            }
        ]
    },
    {
        "id": 0002,
        "title":"something",
        "type":"check",
        "options":[
            {
                "everything":"M016",
                "excludes": []
            },
            {
                "evenmore":"M139",
                "excludes": []
            }
        ]
    },

    [...]
 

Каждый раз, когда выбирается какой-либо вариант, вам нужно будет проверять их список исключений и указывать все эти параметры для определенных полей.
Чтобы улучшить удобство использования, вы можете проверить, что для поля осталась только одна опция, выберите эту опцию, а затем отключите все поле.

РЕДАКТИРОВАТЬ: Кроме того, вы можете сохранить isExcludedBy поле для каждого из параметров.
Тогда everything вариант id 0002 будет выглядеть следующим образом:

 "isExcludedBy": [
    "id": 0001,
    "options": [
        "foobar"
    ]
]
 

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

Ответ №2:

Возможное простое решение (которое отвечает на ваш вопрос):

 // dictionary.json
{
    "options": [
        {
            "id": 0001,
            "title":"foo",
            "type":"radio",
            "options":[
                {
                    "bar":"",
                    "foo":"489",
                    "foobar":"489 490"
                }
            ]
        }
        // etc.; same as before
    ],
    // this is it:
    "dependencies": [
        [["0001", "foobar"], ["0002", "evenmore"]],
    ]
}
 

dependencies здесь состоят из пар [путь к опции в options том, что подразумевает другой вариант, путь к подразумеваемому варианту].
Вы могли бы создать Map структуру данных из этого напрямую (подразумеваемые параметры — это ключи, подразумеваемые значения).

Это предполагает, что один вариант может подразумевать только один другой вариант (но он по-прежнему допускает варианты, которые зависят от нескольких других параметров).

Конечно, вы могли бы легко расширить это следующим образом:

 [["0001", "foobar"], [["0002", "evenmore"], ["0003", "namaste"]]]
 

Это означало бы, что это "0001"/"foobar" подразумевает оба "0002"/"evenmore" и "0003"/"namaste" . Но, возможно, ЯГНИ. 🙂

Ответ №3:

Один из способов приблизиться к этому — смоделировать домен, который вы фактически выражаете, и сгенерировать форму на основе этого. Например, мы знаем, что у квартир есть номера улиц и номера квартир, тогда как у плавучих домов даже нет улиц.

 {
    "dwelling": {
        "type": "houseboat",
        "latitude": null,
        "longitude": null,
    }
}
 

или

 {
   "dwelling": {
       "type": "apartment",
       "street": "Beech St.",
       "street_number": 123,
       "apartment_number": 207,
   }
}
 

Моделируя домен, а не форму, вы можете писать правила, которые применяются за пределами формы, и вам не придется разрабатывать мини-язык для выражения зависимостей формы.

Комментарии:

1. Как бы вы обратились к зависимостям с помощью этого подхода?

2. @omel09 вам не нужно выражать зависимости при таком подходе. У вас будет одна процедура для рендеринга плавучих домов, а другая — для рендеринга квартир. Рендеринг плавучего дома не будет включать номер улицы, а рендеринг квартиры не будет включать долготу.