Заполнение массива объектами при циклическом переходе через отмеченные переключатели каждый раз дает одно и то же значение

#javascript #jquery

#javascript #jquery

Вопрос:

Код ниже:

 $(".day_a_radio").change(function()     
    var radio_array = [];
    var radio_object = {};

    $("input.day_a_radio:checked").each(function() {
        radio_object["id"] = $(this).data("id");
        radio_object["date"] = $(this).data("date");
        radio_object["type"] = $(this).data("type");

        radio_array.push(radio_object);
    });

    console.log(radio_array);
 

У меня есть несколько десятков переключателей с атрибутами данных id, date и type. Когда нажимается один из них, я перебираю их все. Затем в этом цикле для каждого проверяемого я заполняю массив объектами.

Однако, когда я выполняю console.log, идентификатор, дата и тип остаются одинаковыми, несмотря на то, что все переключатели имеют разные значения

введите описание изображения здесь

Есть идеи?

Комментарии:

1. Вы обновляете один и тот же объект на каждой итерации. Вам нужно создавать новый объект на каждой итерации

Ответ №1:

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

 $(".day_a_radio").change(function(){
    var radio_array = [];
    var radio_object = {};

    $("input.day_a_radio:checked").each(function() {
        // MAKE A NEW OBJECT
        radio_object = {};
        radio_object["id"] = $(this).data("id");
        radio_object["date"] = $(this).data("date");
        radio_object["type"] = $(this).data("type");

        radio_array.push(radio_object);
    });
 

Вы также могли бы немного упростить это с помощью карты.

 $(".day_a_radio").change(function(){
    var radio_array = $("input.day_a_radio:checked").map(function() {
        var $this = $(this);
        return {
            id: $this.data("id"),
            date: $this.data("date"),
            type: $this.data("type")
        };
    }).get();
});
 

Ответ №2:

Вы нажимаете same reference на массив to каждый раз, когда вам нужно каждый раз создавать новую копию, а затем нажимаете

 $(".day_a_radio").change(function()     
    var radio_array = [];

    $("input.day_a_radio:checked").each(function() {
        var obj = {}   // It creates a new object everytime
        obj["id"] = $(this).data("id");
        obj["date"] = $(this).data("date");
        obj["type"] = $(this).data("type");

        radio_array.push(obj);
    });

    console.log(radio_array);