これが私の推奨される解決策です:
http://jsfiddle.net/j9RXR/29/
function unqOrMsgTest() {
var rows = $("#binning tbody").children('tr');
var totalRows = rows.length;
var idLookup = {};
var i, rowId, resultClass, checkColumn, rowCount, row;
// loops through all rows, convert to jQuery objects and track the IDs
for (i = 0; i < totalRows; i++)
{
row = $(rows[i]);
rowId = row.children('td[col="check"]').attr("rowid");
rows[i] = row;
idLookup[rowId] = (rowId in idLookup) ? idLookup[rowId] + 1 : 1;
}
// loop through each row and check them for redundancy
for (var i = 0; i < totalRows; i++ )
{
// grab row identifer to check against the id lookup
row = rows[i];
checkColumn = row.children('td[col="check"]');
rowId = checkColumn.attr("rowid");
//this bit of logic picks a class to assign rows
rowCount = idLookup[rowId];
resultClass = rowCount < 2 ? "unique" : "notUnique";
//apply the row class and print the redundancy number into td
checkColumn.text(rowCount);
row.attr("class", resultClass);
};
}
連想配列 (またはハッシュ) を使用して ID とカウントを格納することを提案する上記の回答と同様に、list.each( function() {...} )
dom 要素から jQuery オブジェクトへのすべての呼び出しを削除し、変換の数を最小限に抑えました。
の使用を削除した理由each
は、反復ごとに新しい無名関数が作成され、スタックのスラッシングは言うまでもなく、 this から $(this) への冗長な変換も呼び出されたためです。シンプルな for ループだけで十分であり、はるかに高速です。
jQuery の落とし穴の詳細については、避けるべき jQuery の落とし穴を参照してください。