0

http://jsbin.com/aboca3/95/edit

这是单独数字和字母排序的工作示例。

它运作良好,问题是,它不会按字母顺序对相同<em>数量的项目进行排序。

例如,它在数字排序上给出了 Salpinestars(58)、Joe Rocket (58)。应该给出相反的顺序。

我试图更改items.sort(sortEm).prependTo(self);items.sort(sortAlpha).sort(sortEm).prependTo(self);,但它不起作用。

有什么想法吗?

4

2 回答 2

3

使用这个 sortEm():

function sortEm(a,b){
  var emA = parseInt($('em',a).text().replace(/[\(\)]/g,''));
  var emB = parseInt($('em',b).text().replace(/[\(\)]/g,''));
  if (emA == emB) { // sort alphabetically if em number are equal
    return sortAlpha(a,b);
  }
  return emA < emB ? 1 : -1;
}
于 2012-05-26T19:58:40.133 回答
2

您可以编写一个函数来按两个标准进行排序。

// ORDER BY EmValue, LiMinusEmText

function sortBoth(a, b) {
    var aText = $(a).text().replace(/\(\d+\)\s*$/, "");      // chop off the bracket
    var bText = $(b).text().replace(/\(\d+\)\s*$/, "");      // and numbers portion
    var aValue = +$(a).find("em").text().replace(/\D/g, ""); // parse out em value
    var bValue = +$(b).find("em").text().replace(/\D/g, ""); // and convert to number
    if (aValue == bValue) {
        if (aText == bText) {
            return 0;
        }
        else if (aText < bText) {
            return -1;
        }
        else /*if (aText > bText)*/ {
            return 1;
        }
    }
    else {
        return aValue - bValue;
    }
}

// ORDER BY LiMinusEmText, EmValue

function sortBoth(a, b) {
    var aText = $(a).text().replace(/\(\d+\)\s*$/, "");      // chop off the bracket
    var bText = $(b).text().replace(/\(\d+\)\s*$/, "");      // and numbers portion
    var aValue = +$(a).find("em").text().replace(/\D/g, ""); // parse out em value
    var bValue = +$(b).find("em").text().replace(/\D/g, ""); // and convert to number
    if (aText == bText) {                                    // strings value same?
        return aValue - bValue;                              // then return a - b
    }
    else if (aText < bText) {
        return -1;
    }
    else /*if (aText > bText)*/ {
        return 1;
    }
}
于 2012-05-26T19:59:55.120 回答