2013-03-19 65 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