Заполните форму с данными из ассоциативного массива с jQuery

Вы можете использовать понимание списка:

In [1]: mylist = [[['1',
   ...:     '1@1`']],
   ...:   [['2', '2@2.com']],
   ...:   [['3', '3@3.com']],
   ...:   [['4', '4@4.com']],
   ...:   [['5', '5@5.com']],
   ...:   [['6', '6@6']],
   ...:   [['7', '7@7']],
   ...:   [['8', '8@8']],
   ...:   [['8.5', '8.5@8.5']],
   ...:   [['9', '9@9']],
   ...:   [['10', '10@10']],
   ...:   [['11', '11@11']],
   ...:   [['12', '12@12']],
   ...:   [['13', '13@13.com']],
   ...:   [['14', '14@14.com']],
   ...:   [['15', '15@15.com']],
   ...:   [['16', '16@16.com']],
   ...:   [['17', '17@17.com']],
   ...:   [['18@18.com', '18']],
   ...:   [['19', '19@19.com']]]

In [2]: [{'id': i, 'email': e} for i, e in (pair[0] if '@' not in pair[0][0] else reversed(pair[0]) for pair in mylist)]
Out[2]:
[{'id': '1', 'email': '1@1`'},
 {'id': '2', 'email': '2@2.com'},
 {'id': '3', 'email': '3@3.com'},
 {'id': '4', 'email': '4@4.com'},
 {'id': '5', 'email': '5@5.com'},
 {'id': '6', 'email': '6@6'},
 {'id': '7', 'email': '7@7'},
 {'id': '8', 'email': '8@8'},
 {'id': '8.5', 'email': '8.5@8.5'},
 {'id': '9', 'email': '9@9'},
 {'id': '10', 'email': '10@10'},
 {'id': '11', 'email': '11@11'},
 {'id': '12', 'email': '12@12'},
 {'id': '13', 'email': '13@13.com'},
 {'id': '14', 'email': '14@14.com'},
 {'id': '15', 'email': '15@15.com'},
 {'id': '16', 'email': '16@16.com'},
 {'id': '17', 'email': '17@17.com'},
 {'id': '18', 'email': '18@18.com'},
 {'id': '19', 'email': '19@19.com'}]

Если у вас есть произвольное вложение, вы можете попробовать это:

def flatten(lst):
    for sub in lst:
        if isinstance(sub, list):
            yield from flatten(sub)
        else:
            yield sub

[{'id': i, 'email': e} for i, e in (pair if '@' not in pair[0] else reversed(pair) for pair in zip(*[flatten(mylist)]*2))]
8
задан Community 23 May 2017 в 11:49
поделиться

4 ответа

Когда я сделал это для проекта, я нашел, что, устанавливая значение избранных полей, переключатели и флажки требовали более сложного кода, чего-то вроде:


jQuery.each(data, function (name,value) {
  jQuery("input[name='"+name+"'],select[name='"+name+"']").each(function() {
    switch (this.nodeName.toLowerCase()) {
        case "input":
            switch (this.type) {
                case "radio":
                case "checkbox":
                    if (this.value==value) { jQuery(this).click(); }
                    break;
                default:
                    jQuery(this).val(value);
                    break;
            }
            break;
        case "select":
            jQuery("option",this).each(function(){
                if (this.value==value) { this.selected=true; }
            });
            break;
    }
  });
});

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

Мне не разрешают (еще) прокомментировать комментарии здесь, таким образом.... Как отмечено в комментарии, jQuery .val (val) дескрипторы метода, устанавливающие переключатели, флажки и, выбирает.

Необходимо будет все еще поместить выбор [имя =...] в шаблон селектора jQuery или избранные элементы не будет обновлено.

7
ответ дан 5 December 2019 в 07:13
поделиться

Или подобный предыдущему предложению с помощью имен полей вместо идентификаторов:

$.each(data, function(name,value) {
    $("input[name='" + name + "']").val(value);
});
5
ответ дан 5 December 2019 в 07:13
поделиться

Если Вашим элементам формы установили их идентификатор на имя поля:

$.each(myAssocArry, function(i,val) { $('#'+i).val(val); });
10
ответ дан 5 December 2019 в 07:13
поделиться

Я не видел, чтобы дескриптор jQuery передавал одно (не массивное) значение в val () для ввода радио или флажка. Вы должны убедиться, что единственное значение помещено в массив.

Я также обычно не хотел изменять значения кнопок ввода, поэтому я их отфильтровываю.

Вот функция, которая обрабатывает перенос массива , фильтрация кнопок, а также ограничивает выбор ввода заданным элементом формы. Параметр формы не является обязательным. Если не указано значение / null / undefined, будут выбраны все входные данные на странице.

function populateForm(data, form) {
    $.each( data, function(name, value) {
        var input = $(":input[name='" + name + "']:not(:button,:reset,:submit,:image)", form );
        input.val( ( !$.isArray( value ) && ( input.is(':checkbox') || input.is(':radio') ) ) ? [ value ] : value );
    } );
};
1
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: