заполнение массива в цикле JQuery javascript

369
26 июля 2017, 22:30

использую цикл JQuery .each(function(){});

Пример:

var arr = [], 
  check = ''; 
$('.commander_check').each(function() { 
  if ( 
    $(this).prop('checked') && $(this).data('check') == '' || 
    !$(this).prop('checked') && $(this).data('check') == 'checked' 
  ) { 
    check = $(this).prop('checked') ? 'ON' : 'OFF'; 
    arr[$(this).data('login')][check].push({ 
      'id': $(this).data('id'), 
      'profit': $(this).data('profit') 
    }); 
  } 
}); 
console.log(arr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<input type="checkbox" class="commander_check" data-check="checked" data-id="19727899" data-login="old" data-profit="ok">

Хочу получить массив вида ['old']['OFF'][['id'=>19727899, 'profit'=>'ok'],[...],...]

но почему то вылетает ошибка Cannot read property 'OFF' of undefined

Задача: перебрать параметры чекбоксов и если .prop('checked') не совпадает с $(this).data('check'), то записать это в многомерный ассоциативный массив, вот собственно запись и не получается

Answer 1

var arr = {}, 
  check = ''; 
$('.commander_check').each(function() { 
  var $self = $(this); 
 
  if ( 
    $self.prop('checked') && $self.data('check') == '' || 
    !$self.prop('checked') && $self.data('check') == 'checked' 
  ) { 
    check = $self.prop('checked') ? 'ON' : 'OFF'; 
    // У вас не были объявлены следующие значения. По этому оно не могло добавить туда значения, так как этого объекта в массиве не было 
    arr[$self.data('login')] = {}; 
    arr[$self.data('login')][check] = []; 
     
    arr[$self.data('login')][check].push({ 
      'id': $self.data('id'), 
      'profit': $self.data('profit') 
    }); 
  } 
}); 
 
console.log(arr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<input type="checkbox" class="commander_check" data-check="checked" data-id="19727899" data-login="old" data-profit="ok">

Answer 2

Может быть вы хотели сделать как-то так:

var arr = [], 
  check = ''; 
$('.commander_check').each(function() { 
  if ( 
    $(this).prop('checked') && $(this).data('check') == '' || 
    !$(this).prop('checked') && $(this).data('check') == 'checked' 
  ) { 
    check = $(this).prop('checked') ? 'ON' : 'OFF'; 
    arr.push([$(this).data('login')], [check], { 
      'id': $(this).data('id'), 
      'profit': $(this).data('profit') 
    }); 
  } 
}); 
console.log(arr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<input type="checkbox" class="commander_check" data-check="checked" data-id="19727899" data-login="old" data-profit="ok">

У вас проблема в добавлении в массив.

Answer 3

Спасибо @Yuri - наводка решения была правильно ориентированна по сторонам света, я лишь подкорректировал координаты выстрела

во первых поменял var arr = [] на var arr = {}, как указал @Yuri

и сделал проверку на пустые значения перед заполнением

if( ! ($(this).data('login') in arr)) arr[$(this).data('login')] = {};
if(! (check in arr[$(this).data('login')])) arr[$(this).data('login')][check] =[];

почему в конце [] - видимо .push(); не работает с объектами а только с массивами.

READ ALSO
Конфликт owl.carousel aos-animate

Конфликт owl.carousel aos-animate

Добавляю атрибуты любому объекту внутри owlcarousel и ничего не происходит, проделываю тоже самое вне owl

296
Как прибавлять рандомное значение в setInterval?

Как прибавлять рандомное значение в setInterval?

Здравствуйте! Есть счетчик и код ниже работаетСейчас,судя по строке o

299
Как взять Id из Json?

Как взять Id из Json?

Я использую плагин datatables, чтоб получить данные из бд в таблицу, я делаю ajax запрос и получаю json objects:

261
событие на клик по radio

событие на клик по radio

есть радио кнопка

235