Зависимости карты в структуре JSON - PullRequest
2 голосов
/ 18 апреля 2019

В настоящее время я создаю веб-инструмент, который позволяет пользователю создавать пакет параметров в форме строки.Чтобы выбрать, какие опции он хочет, он использует форму с различными входами (радио, флажок), которая генерируется из 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 правильным форматом здесь.

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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Вы можете попытаться сохранить каждый параметр как один объект, в котором хранятся все параметры, которые будут исключены, если этот параметр выбран.Таким образом, ваш 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"
    ]
]

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

1 голос
/ 03 мая 2019

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

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

или

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

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

1 голос
/ 03 мая 2019

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

// 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".Но, возможно, ЯГНИ.:)

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