3

我目前有以下 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每一行中的元素并对其执行某些操作。

4

3 回答 3

2

我会这样做:

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 集合、节点列表等。

然后循环从该映射构建一个数组。您可能会发现地图比最终数组更有用。

于 2013-08-09T11:50:09.917 回答
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"]]

此方法更详细,如果需要(如果其他属性发挥作用)允许更复杂的分组

于 2013-08-09T11:53:01.333 回答
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);
于 2013-08-09T12:38:03.900 回答