2013-08-09 2 views
2

я в настоящее время следующее JQuery коллекции/объект:Создать массив или объект элементов с тем же динамическим классом

[li.row-0, li.row-1, li.row-2, li-row-2, li.row-2, li.row-3]

Каждого имя класса динамически добавляются к каждому элементу с помощью предыдущего метода. Единственной последовательной частью имени класса является row-. Число может быть от 0 до ∞.

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

[li.row-0] 
[li.row-1] 
[li.row-2, li.row-2, li.row-2, li.row-2] 
[li.row-3] 

выше является лишь догадкой от результата, так как я не 100% уверен, как лучше для достижения этой цели.

Цель состоит в том, чтобы иметь возможность проходить через .row-0, .row-1, .row-2, .row-3 и делать что-то с элементами в каждой отдельной строке.

+2

Просьба показать, что вы пробовали до сих пор, во всяком случае. Вы будете выглядеть гораздо более выгодно, если вы покажете, что вы попытались решить свою проблему самостоятельно, прежде чем задавать здесь:. ' – Bojangles

+0

@Bojangles Мне жаль, что у меня не было кода для обмена, но я, к сожалению, не смог получить свой голова вокруг логики. Задавать вопрос было моим последним прибежищем. :( – mikedidthis

+1

Вот почему я включил «если что», и это хорошо, это было вашим последним прибежищем, а не вашим первым, как и многие ленивые программисты там – Bojangles

ответ

1

Я хотел бы сделать это:

var map = [].reduce.call(arr, function(map, v){ 
    (map[v.className]||(map[v.className]=[])).push(v); 
    return map; 
}, {}); 
var arr2 = []; 
for (var className in map) arr2.push(map[className]); 

reduce строит карту, имеющую в качестве ключей имена классов и значений массивов элементов, имеющих это имя класса.

Я использую [].reduce.call(arr, вместо arr.reduce( так, что он работает для стандартных массивов, коллекций JQuery, нодлистов и т.д.

Затем цикл строит массив из этой карты. Вы можете найти карту более полезной, чем конечный массив.

+0

Совершенно! Карта, как вы упомянули, очень полезна. – mikedidthis

1

Это показывает вам общий способ достижения этой цели, хотя вы, вероятно, с использованием элементов, а не строк, но, надеюсь, это поможет

var tst = ['li.row-0','li.row-1','li.row-2','li.row-2','li.row-2','li.row-3']; 
var grouped = []; 
for(var i in tst) 
{ 
    var text = tst[i]; 
    var num = text.replace('li.row-',''); 
    if(!grouped[num]) grouped[num] = []; 
    grouped[num].push(text); 
} 
console.log(grouped);//[["li.row-0"], ["li.row-1"], ["li.row-2", "li.row-2", "li.row-2"], ["li.row-3"]] 

Использование элементов:

var tst = [li.row-0,li.row-1,li.row-2,li.row-2,li.row-2,li.row-3]; 
var grouped = []; 
for(var i in tst) 
{ 
    var text = tst[i].className; 
    var num = text.replace('row-',''); 
    if(!grouped[num]) grouped[num] = []; 
    grouped[num].push(text); 
} 
console.log(grouped);//[["li.row-0"], ["li.row-1"], ["li.row-2", "li.row-2", "li.row-2"], ["li.row-3"]] 

Этот метод является более подробный и позволяет более сложную группировку, если необходимо (если используются другие атрибуты)

1

Я бы сделал примерно следующее:

var arr = ['li.row-0', 'li.row-1', 'li.row-2', 'li.row-2', 'li.row-2', 'li.row-3']; 
var result = {}; 
$.each(arr, function (index, item) { 
    var ind = item.toString().split('row-')[1]; 
    (result[ind] || (result[ind] = [])).push(item); 
}); 
console.log(result); 
Смежные вопросы