У меня есть динамическая форма, где вы можете нажать кнопку, и в форму добавляется новая строка формы. Запись в форме выглядит так:
<input type='text' class='custom' data-index='".$f."' name='column_value_one' value='1'>
<input type='text' class='custom' data-index='".$f."' name='column_value_two' value='2'>
Например, я добавляю 3 строки из приведенного выше, а data-index - от 0 до 3. Я пытаюсь обработать это, выполнив следующие действия:
var data = [];
$(".custom").each(function() {
var index = parseInt($(this).attr('data-index'));
data[index][$(this).attr("name")] = $(this).val();
});
Я пытаюсь получить конечный результат:
data[0]['column_value_one'] = 1;
data[0]['column_value_two'] = 2;
data[1]['column_value_one'] = 1;
data[1]['column_value_two'] = 2;
Я обычно пишу только PHP, поэтому я выкладываю массив, как указано выше. Но это будет массив Javascript / Jquery, а не PHP.
Буду признателен за любую помощь здесь.
В чем проблема? Похоже, что использование map() и фактического index() родительского элемента может быть лучшим решением по сравнению с выводом статического значения в каждом элементе с сервера.
Найдите последний ввод и добавьте +1 значение последнего ввода при нажатии
Это дает мне ответ. Невозможно установить свойство column_value_one из undefined.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо инициализировать data[index] в {}, если индекс не существует.
data[index] = data[index] || {};
Нравиться:
var data = [];
$(".custom").each(function() {
var index = parseInt($(this).attr('data-index'));
data[index] = data[index] || {};
data[index][$(this).attr("name")] = $(this).val();
});
console.info(data);<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' class='custom' data-index='0' name='column_value_one' value='1'>
<input type='text' class='custom' data-index='0' name='column_value_two' value='2'>
<input type='text' class='custom' data-index='1' name='column_value_one' value='1'>
<input type='text' class='custom' data-index='1' name='column_value_two' value='2'>
<input type='text' class='custom' data-index='2' name='column_value_one' value='1'>
<input type='text' class='custom' data-index='2' name='column_value_two' value='2'>Рад помочь :)
Похоже, вам нужен массив объектов:
data = [
{column_value_one: 1, column_value_two: 2},
// ...
];
В этом случае, поскольку второй ввод следует за первым, вы можете сделать:
var data = $("input[name=column_value_one]").map(function() {
return {column_value_one: this.value, column_value_two: $(this).next().val()};
}).get();
Живой пример:
var data = $("input[name=column_value_one]").map(function() {
return {column_value_one: this.value, column_value_two: $(this).next().val()};
}).get();
console.info(data);<input type='text' class='custom' data-index='0' name='column_value_one' value='11'>
<input type='text' class='custom' data-index='0' name='column_value_two' value='12'>
<input type='text' class='custom' data-index='1' name='column_value_one' value='21'>
<input type='text' class='custom' data-index='1' name='column_value_two' value='22'>
<input type='text' class='custom' data-index='2' name='column_value_one' value='31'>
<input type='text' class='custom' data-index='2' name='column_value_two' value='32'>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>Или, если у вас может быть что-то среднее между ними, используйте два объекта jQuery:
var ones = $("input[name=column_value_one]");
var twos = $("input[name=column_value_two]");
var data = ones.map(function(index) {
return {column_value_one: this.value, column_value_two: twos.eq(index).val()};
}).get();
var ones = $("input[name=column_value_one]");
var twos = $("input[name=column_value_two]");
var data = ones.map(function(index) {
return {column_value_one: this.value, column_value_two: twos.eq(index).val()};
}).get();
console.info(data);<input type='text' class='custom' data-index='0' name='column_value_one' value='11'>
<input type='text' class='custom' data-index='0' name='column_value_two' value='12'>
<input type='text' class='custom' data-index='1' name='column_value_one' value='21'>
<input type='text' class='custom' data-index='1' name='column_value_two' value='22'>
<input type='text' class='custom' data-index='2' name='column_value_one' value='31'>
<input type='text' class='custom' data-index='2' name='column_value_two' value='32'>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>В обоих случаях data-index не нужен (для этого; может быть, он понадобится для чего-то еще).
Спасибо TJ, есть решение. Однако оцените ответ.
@PatrickMcCarthy - Только что добавил еще один. (И если он вам не нужен для чего-то другого, в data-index нет необходимости.)
Я должен был упомянуть, что $ f генерируется циклом PHP для каждого набора из двух будет новый идентификатор индекса данных.