jQuery получает значения из входных данных и создает массив

У меня много входов на странице. Я хочу создать ассоциативный массив с именем и значением каждого входа, используя jQuery. Я пытался:

<input class="activeInput" type="text" name="key1" value="red">
<input class="activeInput" type="text" name="key3" value="France">

inputValues = $('.activeInput').val();

РЕДАКТИРОВАТЬ. Благодаря проницательным комментариям кажется, что создание объекта - лучший способ. Любые предложения о том, как создать объект вместо этого?


person Don P    schedule 23.10.2012    source источник
comment
.val() получает только значение первого ввода. Вы пробовали что-нибудь еще?   -  person Kevin B    schedule 23.10.2012
comment
в заголовке первого просмотра (чтения) я думал, что вы хотите получить значение клавиши клавиатуры   -  person NullPoiиteя    schedule 23.10.2012
comment
@DonnyP половина ответов ниже создает объект.   -  person Kevin B    schedule 24.10.2012
comment
Возможно, вы хотите, как здесь stackoverflow. ком/вопросы/5550220/   -  person nagiyevel    schedule 08.10.2015


Ответы (6)


Вы можете использовать .each() для перебора элементов и добавления имен и значений на карту (обычный объект ) как это:

var map = {};
$(".activeInput").each(function() {
    map[$(this).attr("name")] = $(this).val();
});

alert(map.key1); // "red"

Посмотрите, как это работает.

person Jon    schedule 23.10.2012
comment
Эй, Джон, если бы у меня было, например, 10 входных данных с одним и тем же именем класса, как я могу зафиксировать их, используя приведенный выше код в поле, разделенном запятыми. Мне просто нужна длинная строка их значений, разделенных запятой. - person user1011713; 19.12.2013
comment
@ user1011713: Используйте .map, чтобы получить $(this).val() из каждого элемента, затем Array.join, чтобы объединить значения. - person Jon; 19.12.2013

Чтобы создать массив значений, вы можете сделать это:

var $inputValues = $('.activeInput')
  .map((i, el) => el.val())
  .toArray();

Чтобы создать объект с ключами и значениями, вы можете сделать это:

var data = $('.activeInput')
  .toArray()
  .reduce((accumulator, element) => {
    accumulator[element.name] = element.value;
    return accumulator;
  }, {});
person Samuel Willems    schedule 18.08.2016
comment
@AdamFriedman Я хотел бы отметить, что это не синтаксическая ошибка, и она была фактически удалена в более раннем редактировании. Однако я предпочитаю этот стиль для удобочитаемости. - person Samuel Willems; 27.10.2017
comment
Извините, это не синтаксическая ошибка как таковая, но ваш браузер выдаст ошибку, если в вашей функции map() вы используете this вместо $(this). - person Adam Friedman; 30.10.2017
comment
@AdamFriedman О, это забавно, ты действительно прав. В прошлом году мне сказали, что я должен удалить его, потому что this уже будет объектом jQuery в этом контексте... Однако вы пропустили одно место. - person Samuel Willems; 31.10.2017

Запуская их через цикл, вы можете создать объект со строковыми доступными значениями. В Javascript нет понятия ассоциативного массива, но с помощью синтаксиса квадратных скобок вы можете получить доступ к свойствам объекта почти так же, как ассоциативный массив работает в PHP.

var values = {};
$('.activeInput').each(function() {
    values[this.name] = this.value;
});

console.log(values['key1'], values['key3']);
// Note, this is the same as above.
console.log(values.key1, values.key3);

В вашей консоли вы должны увидеть: красная Франция

Вот http://jsfiddle.net/rEtVt/ для этого.

Это также называется хэш-картой (концепцией), используемой для быстрого поиска.

person earl3s    schedule 23.10.2012
comment
Это создает массив со свойствами. Не ассоциативный массив. - person Kevin B; 23.10.2012
comment
@KevinB прав. Я обновил, чтобы отразить это. Также не уверен, почему другие ответы используют JQuery в цикле, чтобы получить имя и значение, когда вы можете напрямую получить к ним доступ как this.name, this.value. - person earl3s; 24.10.2012
comment
@earl3s: this.name нормально, но .val() работает с <select> элементами, а this.value — нет. - person Jon; 24.10.2012
comment
@ Джон, да, но это <input> элементов! - person Kevin B; 24.10.2012
comment
@KevinB: Конечно, но поскольку jQuery все равно присутствует, почему бы не написать более общий код? - person Jon; 24.10.2012
comment
@ Джон, в большинстве случаев это вопрос мнения, и с этим не стоит спорить. Оба получают одинаковый результат, один просто быстрее. Никто никогда не говорил, что это неправильно делать так или иначе. Оба правильны. - person Kevin B; 24.10.2012

var inputValues = new Array();
$('input').each(function(){
    inputValues[$(this).attr('name')] = $(this).val();
});

Это предполагает, конечно, что вы хотите получить значение всех входных данных.


При этом до моего сведения было доведено много причин не использовать и Array.

person circusdei    schedule 23.10.2012
comment
... Почему inputValues является массивом, если вы рассматриваете его как объект? После каждого массива длина по-прежнему равна 0. - person Kevin B; 23.10.2012
comment
потому что это... я хочу создать ассоциативный массив - person circusdei; 23.10.2012
comment
Javascript не имеет ассоциативных массивов, у него есть объекты. var inputValues = {} - person Kevin B; 23.10.2012
comment
тогда я полагаю... привычка. преимущество использования на объекте? - person circusdei; 23.10.2012
comment
Преимущество в том, что если вы попытаетесь перебрать свой массив, вы будете повторять 0 раз, потому что его длина по-прежнему равна 0. - person Kevin B; 23.10.2012
comment
а зачем это делать? если они вводятся по имени, это не имеет смысла. - person circusdei; 23.10.2012
comment
давайте продолжим это обсуждение в чате - person circusdei; 23.10.2012
comment
Я бы сравнил использование массива таким образом с использованием этого: var inputValues = new String();. Вот пример: jsfiddle.net/5BkbQ Обратите внимание, как вы получаете точно такие же результаты, используя новую строку, новое регулярное выражение и новый массив. Это потому, что все они являются объектами. Зачем хранить объектные значения в массиве? В этом случае нет смысла. То, что это работает, не означает, что вы должны это делать. - person Kevin B; 23.10.2012
comment
хотя, это был вопрос. +1 @KevinB за тонкости объектов JS. - person circusdei; 23.10.2012

Если вам нужно сериализовать форму для отправки ajax, вам следует взглянуть на serialize и serializeArray методы jQuery. Особые случаи могут возникнуть, когда у вас есть много входных данных с одним и тем же атрибутом name, которые должны создавать массив на сервере.

В противном случае я бы вызвал jquery serializeArray для элемента формы и перебрал его результаты, чтобы преобразовать его в объект.

UPD: добавлен пример http://jsfiddle.net/zQNUW/

person Andrey Kuzmin    schedule 23.10.2012

Попробуй это:

var values = new Object() // creates a new instance of an object
$('.activeInput').each(function() {
    values[$(this).attr('name')] = $(this).val()
})

Чтобы проверить свойства объекта:

output = ""
for (property in values) {
  output += property + ': ' + values[property]+'; ';
}
alert(output)
person Community    schedule 23.10.2012
comment
.val() получает только значение первого ввода. (и в этом ответе точно такой же код, как и в вопросе, который не работает.) - person Kevin B; 23.10.2012
comment
Закрыть, но values.$(this).attr('name') не работает. values[$(this).attr('name')] - person Kevin B; 23.10.2012