2014-10-15 3 views
1

Мне нужно создать массив массивов. У меня был довольно обширный цикл if/else, но я думаю, что могу его реорганизовать, используя jQueries nextUntil. Основываясь на том, что я вижу, я нахожусь на правильном пути, но мои результаты просто стесняются того, что мне нужно в обоих направлениях.Как я могу каждый цикл через nextUntil

Вот HTML

var array = [[]]; 

<ul id="list"> 
    <li class="get-it">1</li> 
    <li class="get-it">2</li> 
    <li class="ignore-it">3</li> 
    <li class="get-it">4</li> 
    <li class="get-it">5</li> 
    <li class="ignore-it">6</li> 
    <li class="get-it">7</li> 
    <li class="get-it">8</li> 
    <li class="ignore-it">9</li> 
    <li class="get-it">10</li> 
    <li class="get-it">11</li> 
</ul> 

И вот несколько способов я пытался скоблить .get-It элементов списка

// returns single-item array of all .get-it items 
array.push($('#list').children().nextUntil('.ignore-it'); 

// returns 8 single-item array of .get-it items 
$row.children().nextUntil('.ignore-it').each(function(){ 
    array.push($(this)); 
}); 

Вот что я на самом деле нужно вернулся

// what I need returned 
array = [ 
    [ li[0], li[1] ], 
    [ li[3], li[4] ], 
    [ li[6], li[7] ], 
    [ li[9], li[10] ] 
] 
+1

Вам не нужно '[Li [9], Ли [10] ] 'также? – jmar777

+0

А, да, обновлено – NominalAeon

+1

@NominalAeon разве вы не хотите, чтобы ваш массив имел вспомогательные массивы? –

ответ

3

Это будет работать:

var array = $('.get-it:first, .ignore-it + .get-it').map(function() { 
    return $(this).add($(this).nextUntil('.ignore-it')); 
}).get(); 

JSFiddle

В основном это работает так:

// grab the first .get-it, as well as all .get-it 
// elements that follow an .ignore-it element 
$('.get-it:first, .ignore-it + .get-it') 

// map each of those items into an array that contains 
// itself, plus all .get-it elements up until the next 
// .ignore-it element 
.map(function() { 
    return $(this).add($(this).nextUntil('.ignore-it')); 
}) 

// convert our jQuery collection into a regular array 
.get(); 
+0

Да, я думаю, что это все! Я подключаю его, бонусные очки * за использование nuxtUntil. * Фактические бонусные баллы не присуждаются. – NominalAeon

+1

Ха, спасибо за бонусные баллы :) – jmar777

+0

Это захватывающие синглы, но потом и парные. На самом деле нет такого шаблона, который я могу различить. Я попытался взломать его на два вызова $ ('. Get-it: first') и $ ('. Ignore-it + .get-it'), поэтому я уменьшил его до отказа последнего. Еще впереди – NominalAeon

1

Вы можете это сделать

var array = [], tempArr = $('#list > li.get-it').map(function(){ return $(this); }); 
while(tempArr.length > 0) 
    array.push(tempArr.splice(0, 2)); // splice it into two 

DEMO

Вышеприведенный делает это получить элементы и нарезать их на две части.

+1

Это чисто. Только одно (потенциальное) предостережение состоит в том, что он, конечно, ограничен разметкой, где всегда есть два '.get-it' перед' .ignore-it'. Неясно, является ли это гарантией или нет. – jmar777

+0

Спасибо, я должен был положить его в исходное сообщение, но мне нужно указать длину элемента varialbe между .ignore-it. Иногда бывает два, иногда их пять. – NominalAeon

Смежные вопросы