Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создать Json объект на основе разметки (https://javascript.ru/forum/misc/66370-sozdat-json-obekt-na-osnove-razmetki.html)

Scantraxx 11.12.2016 17:43

Создать Json объект на основе разметки
 
Вложений: 1
Здравствуйте. Задача такова: парсить страницу и на ее основе сформировать массив объектов. Сам объект представляет собой 2 поля: 1)имя 2)массив объектов.
На скрине я цветами выделил все:
красный - это массив объектов
оранжевый - это сам объект в массиве
бардовый - поле "Имя"
желтый - поле массив
Вложение 3376
я пробую делать это как-то так:
<script>
        function PostData() {
            var questionsObj = [];
            var Polls_Possible_Answers = [];
            var c = [];
            var count_questions = $('.questionBlock>div').length;
            for (var j = 0; j < count_questions; j++)
            {
                var count_answers = $('.answer>div').length;
                for (var p = 0; p < count_answers; p++)
                {
                    if ($('#pos_ans[' + p + ']').val() != "") {
                        Polls_Possible_Answers.push($(this).val());
                    };
                    questionsObj[j] = {
                        que_name: $('#que_name['+j+']').val(),
                        posAns_value: Polls_Possible_Answers
                    }
                    
                }
            }
            var json = $.toJSON(questionsObj);
        }
    </script>

Может есть другие идеи как реализовать такую форму? мне надо передать этот набор объектов в контроллер, где я с его буду брать значения и записывать в бд

laimas 11.12.2016 18:26

Зачем парсить, если можно получить коллекцию input? Еще проще использовать форму и ее сериализацию.

Scantraxx 11.12.2016 18:42

Спасибо за совет. Я впервые пробую js и мне тут все в новизну. Можно вас попросить пример, как это будет к моей разметке применяться?

laimas 11.12.2016 18:50

А что именно надо? Ведь самое простое, это обрамить все эти элементы формой:

<form>
<div>....<input>...</div>
....
<div>....<input>...</div>
</form>


и получить ее поля как

var fields = $('form').serialise();


Что ну совсем просто. Вот только если с каждым из полей не связаны другие элементы формы, то указывать явно ключ в имени поля - [0], [1], ... нет необходимости, можно просто [].

Scantraxx 11.12.2016 19:07

Если я вас правильно понял, то применяя к такому примеру:
<form>
<div class="questionValue">
            <h4> Вопрос #1</h4>
                    <input type="text" name="que_name[0]" />
                    <div class="answer">
                        <div class="possibleAnswer">
                            <input <input type='text' name='pos_ans[0]' />
                        </div>
                    </div>
                    <div><p><a class="plus">Добавить ответ</a></p>
                </div>
        </div>
</form>

<form>
<div class="questionValue">
            <h4> Вопрос #2</h4>
                    <input type="text" name="que_name[0]" />
                    <div class="answer">
                        <div class="possibleAnswer">
                            <input <input type='text' name='pos_ans' />
                            <input <input type='text' name='pos_ans' />
                        </div>
                    </div>
                    <div><p><a class="plus">Добавить ответ</a></p>
                </div>
        </div>
</form>


и потом выполнить ваш пример
var fields = $('form').serialise();


то у меня в контроллер передастся json объект такой структуры, как я обозначил а своем скриншоте в первом посте?

laimas 11.12.2016 19:12

Какой язык используется сервером и обязательно ли передача ему JSON? Хотя и это не проблема:

JSON.stringify($('form').serialiseArray()) - все поля формы в json-формате.

PS. Так

<input <input type='text' name='pos_ans' />
<input <input type='text' name='pos_ans' />

нельзя - сервер получит значение последнего поля с именем pos_an, которое "затрет" значение первого с таким же именем.

Scantraxx 11.12.2016 19:17

Серверная часть на c#. Передавать jSON не обязательно, мне подходит любой способ, чтобы отправить в котроллер данные с формы так, чтобы "ответы" соответствовали "вопросам". То есть хочу передать массив, в котором будут объекты с такими данными: имя вопроса, массив[список вопросов]

Scantraxx 11.12.2016 19:30

тогда я буду делать как и раньше, при добавлении на форму элемента input ему будет даваться имя новое, типа:
<input <input type='text' name='pos_ans[0]' />

<input <input type='text' name='pos_ans[1]' />

но, на сколько я понял мне надо сделать, чтобы при динамическом добавлении элемента на форму, получалось следующее:
<form>
<input <input type='text' name='pos_ans[0]' />
</form>

<form>
<input <input type='text' name='pos_ans[0]' />
<input <input type='text' name='pos_ans[1]' />
</form>

верно?

laimas 11.12.2016 19:33

Ну тогда либо JSON, либо разбирать строку GET запроса.
Если имя вопроса (в базе вообще-то под уникальным id такое хранят, а не под именем), тогда достаточно список ответов передавать под ключами имен вопросов (по уму так это будут уникальные id), то есть:

<input type="radio" name="answer[id_вопроса]">
<input type="radio" name="answer[id_вопроса]">
....
<input type="radio" name="answer[id_вопроса]">

следующая группа ответов

<input type="radio" name="answer[id_вопроса]">
<input type="radio" name="answer[id_вопроса]">
....
<input type="radio" name="answer[id_вопроса]">

и так далее. И сервер получит массив ключами которого будут идентификаторы вопросов, а их значениями ответы на них.

laimas 11.12.2016 19:36

Цитата:

Сообщение от Scantraxx
верно?

Зачем куча форм? Все нужно размещать в одной форме, и потом, если вопрос, а на него варианты ответа, из которых нужно выбрать правильный, то это все таки не type='text', а type="radio". Или ответ на вопрос предполагает ввод произвольного текста?


Часовой пояс GMT +3, время: 10:30.