Как создать массив из цикла .each с помощью jQuery

#javascript #jquery

#javascript #jquery

Вопрос:

Как я могу создать массив изнутри цикла .each и использовать его вне цикла?

Мой .each loop :

        // Loop through all but button with class .apply
        $('.profile-nav ul li a').not('.apply').each( function() {

            // if currently loop through element has .cur class
            if( $(this).hasClass('cur') ) {


                //Get the first class of the match element                  
                var ClassesToApply = $(this).prop('class').split(' ')[0];

            }   
            //How can I create an array from all ClassesToApply?


            //var arr = jQuery.makeArray(ClassesToApply);
            // This will create an array, but with one element only

        });
  

Как я могу создать массив из всех var = ClassesToApply ?

И как я могу что-то сделать с этим массивом? например

$( allClasses from an array as a selectors).doStuff();

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

1. Вы получите массив строк. Что вы хотите сделать с таким массивом? Методы jQuery выполняются для массивов, содержащих элементы DOM, а не строки.

2. Я хочу использовать string в качестве селектора для отображения / скрытия элемента с ОДИНАКОВЫМИ классами в разных div. Фильтрация — вроде.

Ответ №1:

Если вы объявите переменную вне each , она будет доступна внутри each :

 var yourArray = [];
$('.profile-nav ul li a').not('.apply').each(function() {
    if($(this).hasClass('cur')) {
        yourArray.push($(this).prop('class').split(' ')[0]);
    }
});
//Here, yourArray will contain the strings you require.
  

Хотя, как показали другие, есть способы значительно сократить ваш код.

Ответ №2:

 fxnReqValidation = function () {
        var InputTagArray = new Array;
        InputTagArray = document.getElementsByTagName("input");
        for (var iCnt = 1; iCnt <= InputTagArray.length; iCnt  ) {
            if ((g_Json[InputTagArray[iCnt].name].required == true) amp;amp; (InputTagArray[iCnt].value == "")) {
                $("#errormsg").text("please enter all required fields");
            }
            return false;
        }
    }
  

Ответ №3:

Вы могли бы сделать:

 var arr = $( 'a.cur:not(.apply)', '.profile-nav' ).map( function () {
    return $( this ).prop( 'class' ).split( ' ' )[0];
}).get();
  

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

1. Отличный пример! Я никогда раньше не использовал ‘.map’, мне нужно разобраться в этом.

2. Если OP want — это массив, не забудьте связать .get() или .toArray() после .map() .

Ответ №4:

 var list = $(".profile-nav ul li a.cur:not(.apply)");

list.each(function(){
   // do your thing!
});
  

Ответ №5:

 var arraySelectors = $('.profile-nav ul li a.cur:not(.apply)')
                        .toArray()
                        .map(e => '.'   Array.from(e.classList).join('.'));
  

Этот фрагмент, вероятно, не самый элегантный, но он пытается соответствовать цели, которую описывал OP.

Я предпочитаю не разделять className, потому что вы никогда не знаете, сколько последовательных пробелов существует.

Выход из массива jQuery и переход к собственному массиву кажется лучшим решением.

  • Array.from() — это ES6 около 2015 года
  • jQuery.toArray() появился в jQuery 1.4