3

かなりグーグルで調べましたが、この問題に対処する方法について頭を悩ませることはできませんでした。

アイテムのリストを持っています/計画しています。

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

私が使えるものにかなり近い。しかし、それを私の用途に合わせて曲げることはできませんでした。

4

3 に答える 3

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任意の条件に基づいてソートできることに注意してください。2番目のエントリでアルファベット順に並べ替える場合は、に渡されたコンパレータ関数でインデックスを作成しArray.prototype.sortます。

3.)これで、のアイテムはgroup_arrグループのアルファベット順になり、グループを持つアイテムが含まれます。のアイテムにlist 1はグループがなく、並べ替えられません。これで、これらの各配列を反復処理し、DOM要素を作成してから、それらを挿入できます。

于 2013-03-19T09:23:03.120 に答える
0

私は同意します、Vinayによる良い答え、私はアンダースコアも提案し、あなたをフィドルにしました。

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
});
于 2013-03-19T09:31:05.767 に答える
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それらを次々と並べ替えることができます。

幸運を!

于 2013-03-19T09:28:22.333 に答える