Форма ввода значений в JSON - PullRequest
0 голосов
/ 23 января 2019

Выпуск

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

{
    "2019-01-23": [
        {
            id: 1,
            period: 'am'
        },
        {
            id: 2,
            period: 'pm'
        }
    ]
}
<select name="dates[2019-01-23][0][id]">
    <option value="1" selected>1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][0][period]">
    <option selected>am</option>
    <option>pm</option>
</select>

<select name="dates[2019-01-23][1][id]">
    <option value="1">1</option>
    <option value="2" selected>2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][1][period]">
    <option>am</option>
    <option selected>pm</option>
</select>

Что я пробовал

var inputs = $(':input').serializeArray();
var json = [];
$.each(inputs, function(key, input) {
    var names = input.name.split(/\[(.*?)\]/);
    var data = [];

    data[names[1]] = [];
    data[names[1]][names[3]] = { id: null, period: null };
    if(names[5] == 'id') {
        data[names[1]][names[3]].id = input.value;
    }
    if(names[5] == 'period') {
        data[names[1]][names[3]].period = input.value;
    }

    json.push(data);
});

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

1 Ответ

0 голосов
/ 23 января 2019

Во-первых, match более подходит для вашего случая, чем split.

Кроме того, поскольку json является литералом объекта, его следует инициализировать пустым объектом ({}), а не массив.

push не совсем подходит для вашего случая.Вместо этого лучше использовать прямое назначение.

Так что код может выглядеть так:

var inputs = $(':input').serializeArray();
var json = {};
$.each(inputs, function(key, input) {
    var keys = input.name.match(/([^\[\]]+)/g).slice(1);
    var date = keys[0], i = keys[1], id = keys[2];
    if (!json[date]) json[date] = [];
    if (!json[date][i]) json[date][i] = {};
    json[date][i][id] = input.value;
});
console.log(JSON.stringify(json));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<select name="dates[2019-01-23][0][id]">
    <option value="1" selected>1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][0][period]">
    <option selected>am</option>
    <option>pm</option>
</select>

<select name="dates[2019-01-23][1][id]">
    <option value="1">1</option>
    <option value="2" selected>2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][1][period]">
    <option>am</option>
    <option selected>pm</option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...