2013-08-05 150 views
0

我有一组<tr>元素,我想批量排序,即每排第n个元素用于排序算法中的比较,随后的n-1元素随第n个元件。 (更新:我要澄清,我没有对HTML控件)按javascript中的每第n个元素排序

在下列情况下,该行由第1的值按字母顺序排列,第4 & 7元即苹果,香蕉&椰子。以下他们随后的2个<tr>元件与它们一起移动即3.

批次之前排序:

<tr> Banana </tr> 
<tr> - Shake </tr> 
<tr> - Chips </tr> 
<tr> Apple </tr> 
<tr> - Juice </tr> 
<tr> - Sauce </tr> 
<tr> Coconut </tr> 
<tr> - Curry </tr> 
<tr> - Water </tr> 

排序后:

<tr> Apple </tr> 
<tr> - Juice </tr> 
<tr> - Sauce </tr> 
<tr> Banana </tr> 
<tr> - Shake </tr> 
<tr> - Chips </tr> 
<tr> Coconut </tr> 
<tr> - Curry </tr> 
<tr> - Water </tr> 

有例如一些直线向前的方式将其拆分为3个列表,并正常排序第一个列表。然后根据第一个列表排序第二个第二个&。我的问题是,是否可以在array.sort([compareFunction])的比较函数中执行?

更新: 另一种方法是将其转换成一个数组这样

[['Banana','- Shake', '- Chips'],['Apple', '- Juice','- Sauce'],['Coconut','- Curry', '- Water']] 

像这样sort(function(a, b) {return a[0] - b[0]})

+0

你的主要问题与操纵DOM的排序没有太大关系。您提供的HTML并不完全适合您要执行的任务 - 子项与父母出现在同一顶层,父母和子女之间没有任何关系,而是含糊不清的“这些事情随之而来并开始'''是我的孩子“。我会从改进HTML开始,否则任何解决方案都会变得脆弱。 – Jon

+0

模数操作是选择项目的好起点。 – cr0

+0

@Jon:我无法控制HTML,但我知道每个第n个元素都是关键。 – Medorator

回答

1

是有可能做到这一点在array.sort(compareFunction)比较函数?

是的,通过使array项目层级感知。所以你必须引入一个指针,从ShakeBanana,从ChipsBanana,从JuiceApple等等。然后,比较功能看起来像

function compare(a, b) { 
    var aTop = a.parent || a, 
     bTop = b.parent || b; 
    if (aTop.value > bTop.value) return 1; 
    if (aTop.value < aTop.value) return -1; 
    if (b.parent == a) return 1; 
    if (a.parent == b) return -1; 
    if (a.value > b.value) return 1; 
    if (a.value < b.value) return -1; 
    return 0; 
} 

这将有可能多一点编程方式(使用数组),但相信我 - 你真的不希望这样。

类似的方法将是简单地拼接阵列为字符串(["Banana"]"Banana"["Banana", "Shake"]"Banana-Shake"),这样就不需要自定义比较功能更多,然后将它们分拣取回后分裂原始值。

但是,您的分组方法优于这些方法,因为它比较少需要比较。

+0

这个答案肯定给了我一个很好的使用比较函数的指针。虽然我同意分组方法运作良好。 – Medorator

0

排序它,我想你会需要通过额外的通表,这可以在创建表时完成。您需要根据标题行和子项创建一个“键”。

所以这一关你之后,我展示属性,但你可以用js属性,而不是:该密钥

+0

这将不保留孩子的订货.... – nneonneo

+0

哎呀,没注意到第二梯队应该留在原来的顺序 – Adrian

1

排序

<tr data-key="Banana"> Banana </tr> 
    <tr data-key="Banana - Shake"> - Shake </tr> 
    <tr data-key="Banana - Chips"> - Chips </tr> 
    <tr data-key="Apple"> Apple </tr> 
    <tr data-key="Apple - Juice"> - Juice </tr> 
    <tr data-key="Apple - Sauce"> - Sauce </tr> 
    <tr data-key="Coconut"> Coconut </tr> 
    <tr data-key="Coconut - Curry"> - Curry </tr> 
    <tr data-key="Coconut - Water"> - Water </tr> 

然后我用了一个基本阵列显示的方法,但这个工作对我来说:

var groupSize = 3;  
var arr = ['banana',' - shake',' - chips','apple',' - juice',' - sauce','coconut',' - curry',' - water']; 
var newArr = []; 
while((sec = arr.splice(0,groupSize)).length > 0) 
{ 
    newArr.push(sec); 
} 
newArr.sort() 
arr = []; 
for(var i in newArr) 
{ 
    for(var j in newArr[i]) 
    { 
     arr.push(newArr[i][j]); 
    } 
} 
console.log(arr); //["apple", " - juice", " - sauce", "banana", " - shake", " - chips", "coconut", " - curry", " - water"] 
+0

这基本上是我在更新已经加入到我的问题的方法的实现。最好是明确指定sort中的compare函数是基于第一个元素的。虽然我正在寻找一个更短的解决方案,但暂时适用。 +1。 – Medorator

+0

@buffer添加一个匿名函数和混淆代码以获得相同结果有什么意义? – SmokeyPHP

+0

@buffer我不知道有什么办法可以用较少的代码清楚地得到相同的结果。它可能存在,但至少有更详细的代码是这样的,如果将来需要时可以更容易地调整 – SmokeyPHP

相关问题