2013-03-19 64 views
3

圍繞一個公平的搜索引擎,但無法圍繞如何處理這個問題。如何使用js數組,查找和分組項目?

我有/計劃項目清單。

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

相當接近我可以使用。儘管如此,我無法設法將其彎曲到我的使用。

+0

@tracevipin基於他的推薦鏈接我認爲他試圖找出一些與'shift'和'unshift'工作的東西。當然多維數組會導致一些雜亂無章的檢查以使其全部工作。 – 2013-03-19 09:36:22

+0

請說明你想要什麼樣的分類。你想要在每個組內進行排序。或者按照他們的名字排列組別。 – average 2013-03-19 10:20:46

+0

我想要在A-Z中的團體。這些項目,分組與否,A-Z。 – Xavio 2013-03-19 11:41:18

回答

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元素,然後插入它們。

+0

純JS不是必需的:) – Xavio 2013-03-19 11:52:01

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檢查(組)後辦理其他值,一個又一個之後,他們全部整理出來。

祝你好運!

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 
}); 
+0

什麼'sort()'比較好的事情(根據你的第一個檢查,如果長度等於3),是'undefined == undefined',使它不是真正的擔心使用'a [2] == b [2]'來查看它們是否都沒有第三個索引鍵。好的回答壽,愛它! :) – 2013-03-19 09:34:12

+0

這很整潔,只需要分組。 – Xavio 2013-03-27 09:31:08