jQuery pobiera wartości zaznaczonych pól wyboru do tablicy

129

Próbuję uzyskać wartości wszystkich pól wyboru, które są obecnie zaznaczone i przechowywać je w tablicy. Oto mój dotychczasowy kod:

 $("#merge_button").click(function(event){
    event.preventDefault();
    var searchIDs = $("#find-table input:checkbox:checked").map(function(){
      return $(this).val();
    });
    console.log(searchIDs);
  });

Jednak daje to więcej niż potrzebuję. Nie tylko dostaję wartości, ale także inne rzeczy, których nie chcę.

["51729b62c9f2673e4c000004", "517299e7c9f26782a7000003", "51729975c9f267f3b5000002", prevObject: jQuery.fn.jQuery.init [3], kontekst: dokument, jquery: "funkcja… 1.9.1", konstruktor: funkcja…

Chciałbym tylko ID (w tym przypadku pierwsze 3 pozycje).

Używając $.eachi wypychając wartości do tablicy, otrzymuję pożądane dane wyjściowe:

$("#find-table input:checkbox:checked").each(function(){ myArray.push($(this).val()); })

["51729b62c9f2673e4c000004", "517299e7c9f26782a7000003", "51729975c9f267f3b5000002"]

Jednak chciałbym użyć $.map, ponieważ oszczędza mi linię kodu i jest ładniejszy.

Dzięki

jeśli __name__ ma wartość Brak
źródło

Odpowiedzi:

262

Wywołaj .get()na samym końcu, aby przekształcić wynikowy obiekt jQuery w prawdziwą tablicę.

$("#merge_button").click(function(event){
    event.preventDefault();
    var searchIDs = $("#find-table input:checkbox:checked").map(function(){
      return $(this).val();
    }).get(); // <----
    console.log(searchIDs);
});

Zgodnie z dokumentacją :

Ponieważ wartość zwracana jest obiektem jQuery, który zawiera tablicę, bardzo często wywołuje się funkcję .get () na wyniku, aby pracować z podstawową tablicą.

Andrew Whitaker
źródło
1
Spodziewałem się prawdziwego Array od $.map. Dzięki za rozwiązanie, działa.
jeśli __name__ to None,
Dziękuję bardzo, potrzebuję tego dla ma Ticketcenter
Steven,
2
Nie rozumiem tego, dlaczego .get()jest potrzebny, gdy funkcja zwraca wartość .val()z każdego elementu w kolekcji jQuery. Czy to dlatego, że mapzamienia go z powrotem w obiekt jQuery przed przekazaniem go do searchIDs?
ikonoklast
Czy możemy uzyskać wartość jako typ tablicy?
krutssss
22

DEMO: http://jsfiddle.net/PBhHK/

$(document).ready(function(){

    var searchIDs = $('input:checked').map(function(){

      return $(this).val();

    });
    console.log(searchIDs.get());

});

Po prostu wywołaj get (), a otrzymasz tablicę tak, jak jest zapisana w specyfikacji: http://api.jquery.com/map/

$(':checkbox').map(function() {
      return this.id;
    }).get().join();
Cristi Pufu
źródło
18

Musisz dodać .toArray()na końcu swojej .map()funkcji

$("#merge_button").click(function(event){
    event.preventDefault();
    var searchIDs = $("#find-table input:checkbox:checked").map(function(){
        return $(this).val();
    }).toArray();
    console.log(searchIDs);
});

Demo: http://jsfiddle.net/sZQtL/

tymeJV
źródło
10

Trochę refaktoryzowałem twój kod i wydaje mi się, że przyszedłem z rozwiązaniem, którego szukałeś. Zasadniczo zamiast ustawiania searchIDswynikać z po .map()prostu wstawiłem wartości do tablicy.

$("#merge_button").click(function(event){
  event.preventDefault();

  var searchIDs = [];

  $("#find-table input:checkbox:checked").map(function(){
    searchIDs.push($(this).val());
  });

  console.log(searchIDs);
});

Stworzyłem skrzypce z uruchomionym kodem.

Mark Meyer
źródło
5
     var ids = [];

$('input[id="find-table"]:checked').each(function() {
   ids.push(this.value); 
});

Ten pracował dla mnie!

Thalinda Bandara
źródło
1

Wymagane, aby elementy formularza nazwane w kodzie HTML jako tablica były tablicą w obiekcie javascript, tak jakby formularz został faktycznie przesłany.

Jeśli istnieje formularz z wieloma polami wyboru, takimi jak:

<input name='breath[0]' type='checkbox' value='presence0'/>
<input name='breath[1]' type='checkbox' value='presence1'/>
<input name='breath[2]' type='checkbox' value='presence2'/>
<input name='serenity'  type='text' value='Is within the breath.'/>
...

Wynikiem jest obiekt z:

data = {
   'breath':['presence0','presence1','presence2'],
   'serenity':'Is within the breath.'
}


var $form = $(this),
    data  = {};

$form.find("input").map(function()
{
    var $el  = $(this),
        name = $el.attr("name");

    if (/radio|checkbox/i.test($el.attr('type')) && !$el.prop('checked'))return;

    if(name.indexOf('[') > -1)
    {
        var name_ar = name.split(']').join('').split('['),
            name    = name_ar[0],
            index   = name_ar[1];

        data[name]  = data[name] || [];
        data[name][index] = $el.val();
    }
    else data[name] = $el.val();
});

I jest tu mnóstwo odpowiedzi, które pomogły ulepszyć mój kod, ale były albo zbyt złożone, albo nie dokładnie tego chciałem: Konwertuj dane formularza na obiekt JavaScript za pomocą jQuery

Działa, ale można go ulepszyć: działa tylko na tablicach jednowymiarowych, a wynikowe indeksy mogą nie być sekwencyjne. Właściwość length tablicy zwraca następny numer indeksu jako długość tablicy, a nie rzeczywistą długość.

Mam nadzieję, że to pomogło. Namaste!

i_a
źródło
1
var idsArr = [];

$('#tableID').find('input[type=checkbox]:checked').each(function() {
    idsArr .push(this.value);
});

console.log(idsArr);
Qammar Feroz
źródło
0

Nie używaj „każdego”. Służy do operacji i zmian w tym samym elemencie. Użyj „map”, aby wyodrębnić dane z treści elementu i użyć ich w innym miejscu.

MItrajyoti Kusari
źródło
Dokumentacja jQuery zawiera świetne przykłady większości wszystkiego, w tymmap
jinglesthula
0

tutaj pozwala to klasa pól wyboru na stronach, a var pozwala gromadzić je w tablicy i można sprawdzić, czy pętla została sprawdzona, a następnie wykonać żądaną operację indywidualnie. Tutaj ustawiłem niestandardową ważność. Myślę, że to rozwiąże twój problem.

  $(".allows").click(function(){
   var allows = document.getElementsByClassName('allows');
   var chkd   = 0;  
   for(var i=0;i<allows.length;i++)
   {
       if(allows[i].checked===true)
       {
           chkd = 1;
       }else
       {

       }
   }

   if(chkd===0)
   {
       $(".allows").prop("required",true);
       for(var i=0;i<allows.length;i++)
        {
        allows[i].setCustomValidity("Please select atleast one option");
        }

   }else
   {
       $(".allows").prop("required",false);
       for(var i=0;i<allows.length;i++)
        {
        allows[i].setCustomValidity("");
        }
   }

}); 
Manish
źródło