如何使用js数组,查找和分组项目?

时间:2013-03-19 08:57:12

标签: javascript sorting filter grouping

用Google搜索了一下,但无法解决如何处理这个问题。

我有/计划一个项目列表。

var list1 = [
  [141,'AAA', 'A Group'],
  [262,'BBB', 'B Group'],
  [345,'CCC', 'B Group'],
  [136,'DDD'],
  [095,'EEE', 'A Group'],
  [175,'FFF'], and so on...
];

我的目标是打印这些物品。 首先按字母顺序排列。此后无组织。

所有项目均按字母顺序排列。

最终结果如下:

<div>

<h2>A Group</h2>
<ul class="group">
    <li>
        <img src="/141">
        <h3>AAA</h3>
    </li>
    <li>
        <img src="/095">
        <h3>EEE</h3>
    </li>
</ul>

<h2>B Group</h2>
<ul class="group">
    <li>
        <img src="/262">
        <h3>BBB</h3>
    </li>
    <li>
        <img src="/345">
        <h3>CCC</h3>
    </li>
</ul>

<h2>No group</h2>
<ul class="non-group">
    <li>
        <img src="/136">
        <h3>DDD</h3>
    </li>
    <li>
        <img src="/175">
        <h3>FFF</h3>
    </li>
</ul>

</div>

有关如何解决这个问题的想法吗?


找到了这个,https://stackoverflow.com/a/7596924/543365

非常接近我可以使用的东西。但是无法将它弯曲到我的使用状态。

3 个答案:

答案 0 :(得分:2)

我建议调查 underscorejs ,但是,如果你想使用纯javascript:

1。)对列表进行排序,使具有组的项目排在第一位。

var i = 0,
    group_arr = [];
for (i = 0; i < list1.length; i++) {
    if (list1[i][2] !== undefined) {
        group_arr.append(list1.splice(i, 1)[0]);
    }
}

2。)现在,所有带有群组的项目都在group_arr,而没有群组的项目在list1。我们现在需要对group_arr进行排序,使其按组的字母顺序排列:

group_arr.sort(function (item1, item2) {
    return (item1[2] > item2[2]) ? 1 : -1;
});

请注意,我们可以根据任意条件对group_arr进行排序。如果您想按第二个条目按字母顺序排序,只需将比较器函数中的索引转换为Array.prototype.sort

3。)现在group_arr中的项目按组的字母顺序排列,并包含具有组的项目。 list 1中的项目没有组,也没有排序。您现在可以遍历每个数组,创建DOM元素,然后插入它们。

答案 1 :(得分:0)

Vinay的回答很棒。这样的事情也应该有效:

var list1 = [
    [141,'AAA', 'A Group'],
    [262,'BBB', 'B Group'],
    [345,'CCC', 'B Group'],
    [136,'DDD'],
    [095,'EEE', 'A Group'],
    [175,'FFF']
];

var list1_new = list1.sort(function(a, b){
    if (a[2] == b[2]) {
        return 0; // Do nothing
    }

    if (a[2] > b[2]) {
        return 1; // Put a AFTER b
    }

    if (a[2] < b[2]) {
        return -1; // Put a BEFORE b
    }
});

console.log(list1_new);

在检查索引sort()(组)后,您可以重新运行2函数来处理其他值,以便在一个和另一个之后对它们进行排序。

祝你好运!

答案 2 :(得分:0)

我同意,Vinay的答案很好,我也建议使用下划线并让你成为fiddle

var groups = _.filter(list1,function(entry){
    return entry.length == 3;
});

var groupsSorted = _.sortBy(groups,function(entry){
    return entry[2] + entry[1]; //sort by group name and second element
});