#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 вам не нужно выражать зависимости при таком подходе. У вас будет одна процедура для рендеринга плавучих домов, а другая — для рендеринга квартир. Рендеринг плавучего дома не будет включать номер улицы, а рендеринг квартиры не будет включать долготу.