0

我有一组<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])

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

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

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

4

3 回答 3

1

我使用了一个基本数组来显示该方法,但这对我有用:

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"]
于 2013-08-05T08:39:31.370 回答
1

是否可以在比较功能中做到这一点array.sort(compareFunction)

是的,通过使array项目层次结构感知。所以你必须引入一个指针 from Shaketo Banana, from Chipsto Banana, from JuicetoApple等等。比较函数看起来像

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"]→<code>"Banana", ["Banana", "Shake"]→<code>"Banana-Shake"),这样您就不再需要自定义比较函数,然后拆分它们排序后取回原始值。

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

于 2013-08-05T10:11:32.343 回答
0

我认为您将需要额外通过表,这可以在创建表时完成。您需要根据标题行加上子项创建一个“键”。

因此,在您完成此通行证之后,我正在显示属性,但您可以使用 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>

然后按该键排序

于 2013-08-05T08:28:44.413 回答