#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