簡體   English   中英

按javascript中的每個第n個元素排序

[英]Sorting by every nth element in javascript

我有一組<tr>元素,我想分批排序,即每個第n個元素用於排序算法中的比較,隨后的n-1個元素與第n個元素一起移動。 更新 :我應該澄清我無法控制HTML)

在下面的例子中,行按照第1,第4和第7個元素的值按字母順序排序,即Apple,Banana和Coconut。 隨后的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])的compare函數中array.sort([compareFunction])

更新 :另一種方法是將其轉換為這樣的數組

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

並按此sort(function(a, b) {return a[0] - b[0]})

我使用了一個基本數組來顯示方法,但這對我有用:

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"]

是否可以在array.sort(compareFunction)的compare函數中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" ),這樣您就不需要自定義比較再次運行,然后在排序后拆分它們以獲取原始值。

但是,您的分組方法優於這些方法,因為它需要更少的比較。

我認為你需要額外的通過表,這可以在創建表時完成。 您需要根據標題行和子項創建“鍵”。

所以在你通過這個傳遞之后,我正在顯示屬性,但你可以使用js屬性:

    <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>

然后按那個鍵排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM