[英]Javascript: sorting objects
當我碰壁時,我正在尋找一些有關如何完成此操作的想法。
我有一個表,顯示從MySQL數據庫提取的數據。 該表按順序排列,每行包含13個單元格,其中顯示數據,后跟一個單元格的隱藏行。 通過單擊上一行單元格索引1中的鏈接可以切換隱藏行。 像這樣:
第1行:單擊此單元格以顯示第2行:另一個單元格:另一個單元格:出現惡心,直到第13行:隱藏的第2行。第3行:單擊此單元格以顯示第2行:另一個單元格:另一個單元格:無味直到我們到達13:隱藏的第4行...
因此,使用jquery提取了所有行,然后進行測試以確定它是顯示的行還是隱藏的行,如果顯示了該行,則將該行和下一行放入一個對象,然后將該對象放入另一個對象,像這樣:
//this function is for sorting the data in the table
$(".sort").click(function() {
//get what column we are sorting by
var sortBy = $(this).attr('sortBy');
//set the colnum to sort by
if (sortBy == "itemname") {
var sortCol = 1;
} else if (sortBy == "priority") {
var sortCol = 2;
} else if (sortBy == "livedate") {
var sortCol = 10;
} else if (sortBy == "status") {
var sortCol = 11;
} else if (sortBy == "designer") {
var sortCol = 12;
}
//get the table data
var tableData = getTableData("NO", "null", "YES", sortBy);
//get all the rows
var tableRowArray = $("#productTableBody tr");
//declare new table object
var tableObj = new Object;
var rowPackage = new Object;
//loop through tableRowArray and put rows into packages of two, the main row and the hidden row
for(var t=0; t<tableRowArray.length; t++) {
if($(tableRowArray[t]).children(":first").attr('class') == "colorCode") {
rowPackage[t] = $(tableRowArray[t]).children();
rowPackage[t+1] = $(tableRowArray[t+1]).children();
//dump rows into tableObj
tableObj[t] = rowPackage;
}
//clean out rowPackage
rowPackage = {};
}
var x=-2;
for(thisRow in tableObj) {
x = x+2;
var sortItem = $(tableObj[thisRow][x][sortCol]).html();
//ack! -->getting stumped here
}
});
我還收集了用戶要排序的列。 然后,我可以找到用戶想要排序的單元格。 我知道我需要提取該信息,放入數組並進行排序,但是我想我對如何將排序后的數組應用到tableObj感到很困惑,因此我可以重寫表主體HTML ...我陷入困境的原因是指某些要排序的數據將是相同的,例如,如果按設計者進行排序,則數據可能是{{a“,” b“,” c“,” c“,” a“,” a“,” “ a”},排序時將是a,a,a,a,b,c,c,但是由於有些相同,所以我無法返回並遍歷對象並找到與第一個項目匹配的條目我的排序數組將匹配4個項目,那么如何確定對象中的哪個條目與排序列表中的第一個匹配?
提前致謝。
這是一個艱難的過程,但我想這輩子幾乎沒有什么不可能的。
我會這樣(使用Underscore庫 )
var packs = [];
// assuming you always have even number of tr's
$("#productTableBody tr:odd").each(function(i, tr){
packs.push( {main: tr, sub: tr.next()} );
// tr.next() will be :even, so it's not yet selected
// now detach rows from the table
// note the order - next() wont work otherwise
tr.next().remove();
tr.remove();
});
var sortedPacks = _(packs).sortBy(function(pack){
return $(pack.main).find('td:nth('+sortCol')').text();
});
// now in sortedPacks you have touples of rows sorted by "main" rows sortCol column
// and you would probably want to restore the table now
$.each(packs, function(i, pack){
$("#productTableBody").append(pack.main).append(pack.sub);
});
該代碼可能無法完美地反映您的情況,但是我想您應該能夠理解主要思想。
在這里很難得到您想要的東西,但這至少將使您能夠對數據進行排序。
首先將數據收集到數組中,例如data
,每一行都可以由數組或對象表示。
現在只需致電
data.sort(function(a, b){
// select the two values from a and b depending on the column to sort by
a = a[colNr];
b = b[colNr];
return a == b ? 0 : a < b ? -1 : 1;
});
現在,您可以輕松地基於已排序的數組重建表。
如果您在數據收集期間還向陣列/對象添加了對該行的引用,那么您現在可以從表中刪除所有行,遍歷data
數組,並將每個節點添加回表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.