2014-01-08 4 views
0

Итак, у меня есть форма, отображающая таблицу с двумя флажками в строке. Когда форма отправлена, я пытаюсь выполнить ajax строки, в которых по крайней мере один флажок выбран для бэкэнд.Обнаружение дублирующих элементов jquery в массиве javascript

Markup:

<form id="my_form"> 
    <table> 
    <tr data-id="1"> 
     <td><input type="checkbox" class="js-option-1"></td> 
     <td><input type="checkbox" class="js-option-2"></td> 
    </tr> 
    <!-- etc --> 
    </table> 
</form> 

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

$("#my_form").live 'submit', (event) -> 
    event.preventDefault() 
    rows = [] 
    $("input:checked").each() -> 
    rows.push row 
    objects = [] 
    $.each objects, (index, value) -> 
    object = { 
     id: $(@).attr("data-id") 
     option_1: $(@).find("js-option-1").val() 
     option_2: $(@).find("js-option-2").val() 
    } 
    objects.push object 
    # ajax code 

Проблема, конечно, является то, что если оба опции проверяются, в итоге я получаю два объекта в массиве и, таким образом, перенаправляют отправляемые данные.

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

$("input:checked").each() -> 
    row = $(@).closest("tr") 
    if $.inArray(row, rows) == -1 #if no duplicate 
    rows.push row 

# or 

if $.inArray(object, objects) == -1 
    objects.push object 

Оба эти подхода не удалось, однако, так как я предполагаю, что механизм для сравнения литералов объектов и Объекты jquery приводят к тому, что они считаются не равными, хотя они одинаковы во всех обычных отношениях. Любые другие идеи?

+1

Вы понимаете 'live' устарел в течение многих лет, и был удален * * в v1.9 ... –

+0

сравнивает родные узлы DOM – adeneo

+1

Если оба флажка отмечены, вы отправляете избыточные данные ... почему бы просто не использовать радиокнопки, тогда вам вообще не нужно будет проверять? – ToastyMallows

ответ

1

Используйте селектор

$(':checked').closest('tr') 

Так что ваша логика выбора не включает дубликаты в первую очередь. Или, если вы предпочитаете логику наоборот, это более очевидно:

$('tr').has(':checked') 
+1

Возможно, это ответ. Может использовать ** много ** лучшее объяснение. Или действительно любой. –

+0

Добавлены некоторые, но не могут найти лучшего объяснения. – peterfoldi

0

Не перебрать коллекцию input:checked, но на tr:has(:checked), что, как вы будете обрабатывать только каждую строку, которая имеет по крайней мере, один параметр отмечен один раз.

попробовать: http://jsfiddle.net/NrHQ4/ (извините, не кофе)

$('#my_form').on('submit', function(e){ 
    var $this = $(this), rows = $this.find('tr:has(:checked)'), objects = []; 
    rows.each(function(){ 
     var $row = $(this); 
     objects.push({ 
      id : $row.data('id'), 
      option_1 : $row.find('.js-option-1').is(':checked'), 
      option_2 : $row.find('.js-option-2').is(':checked') 
     }); 
    }); 
    console.log(objects); 
    e.preventDefault(); 
}); 
Смежные вопросы