Сериализация массива в JQuery?

Как подготовить этот массив для $.ajax submit? Здесь образы возвращаются ["val1","val2"], но после того, как я использую $.param(images), я вернусь undefined=undefined&undefined=undefined

   $('#rem_images').click(function(){
         var images = new Array();
        $('.images_set_image input:checked').each(function(i){
            images[i] = $(this).val();
        });
        alert($.param(images));
        return false;

В общем, идея состоит в том, чтобы проверять изображения, которые нужно удалить на странице, а затем в цикле кликов по всем проверенным изображениям и сериализовать массив для отправки через ajax на php script.

Ответ 1

Вы не передаете массив в правильном формате до $.param. Из jQuery.param docs:

Если переданный объект находится в массиве, он должен быть массивом объектов в формате, возвращаемом .serializeArray().

Массив должен быть массивом объектов, состоящих из пар имя/значение. Вы видите undefined=undefined&undefined=undefined, потому что "val1".name, "val1".value, "val2".name и "val2".value - все undefined. Он должен выглядеть примерно так:

[{name: 'name1', value: 'val1'}, {name: 'name2', value: 'val2'}]

Итак, вы можете построить такой массив (если ваши флажки имеют атрибут name):

$('#rem_images').click(function(){
    var images = [];
    $('.images_set_image input:checked').each(function(){
        var $this = $(this);
        images.push({name: $this.attr('name'), value: $this.val()});
    });
    alert($.param(images));
    return false;
});

Однако даже slicker должен использовать .map() (потому что функциональное программирование - это хороший материал):

$('#rem_images').click(function(){
    var images = $('.images_set_image input:checked').map(function(){
        var $this = $(this);
        return {name: $this.attr('name'), value: $this.val()};
    }).get();
    alert($.param(images));
    return false;
});

Ответ 2

Смотрите docs для $.param:

Если переданный объект находится в массиве, он должен быть массивом объектов в формате, возвращаемом .serializeArray()

[{name:"first",value:"Rick"},
{name:"last",value:"Astley"},
{name:"job",value:"Rock Star"}]

Это означает, что вам нужно сгенерировать массив таким же образом:

$('.images_set_image input:checked').each(function(i){
    images.push({ name: i, value: $(this).val() });
});

Ответ 3

Я нахожу отличную функцию, чтобы сделать это из другого вопроса fooobar.com/info/41650/...

Эта функция возвращает массив с парами значений ключа

$.fn.serializeObject = function () {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }      
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

Чтобы использовать этот вызов:

var Form_Data = $('form').serializeObject();
console.log(Form_Data);