2013-08-05 72 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

相關問題