我有一组<tr>
元素,我想分批排序,即每个第n个元素用于排序算法中的比较,随后的n-1个元素与第n个元素一起移动。 (更新:我应该澄清我无法控制HTML)
在下面的例子中,行按字母顺序排列第1,第4和第4位的值。第7个元素,即Apple,Banana&amp;椰子。随后的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个列表并正常排序第一个列表。然后排序第二&amp;第三个基于第一个列表。我的问题是,是否可以在array.sort([compareFunction])
中的比较函数中执行此操作?
更新: 另一种方法是将其转换为像这样的数组
[['Banana','- Shake', '- Chips'],['Apple', '- Juice','- Sauce'],['Coconut','- Curry', '- Water']]
并将其排序为sort(function(a, b) {return a[0] - b[0]})
答案 0 :(得分: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"]
答案 1 :(得分:1)
是否可以在
的比较功能中执行此操作array.sort(compareFunction)
?
是的,通过使array
项层次结构感知。因此,您必须引入从Shake
到Banana
,从Chips
到Banana
,从Juice
到Apple
的指针,依此类推。然后比较函数看起来像
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"
),这样您就不需要自定义比较函数,然后在排序后拆分它们以获取原始值。
但是,您的分组方法优于这些方法,因为它需要更少的比较。
答案 2 :(得分: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>
然后按该键排序