使用jQuery按字母顺序排序列表然后按字母顺序排序?

时间:2012-05-26 19:27:11

标签: javascript jquery dom sorting

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

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

效果很好,问题是,它没有按字母顺序对具有相同<em>个数字的项目进行排序。

E.g。它给出了Salpinestars(58),Joe Rocket(58)的数字排序。应该给出相反的顺序。

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
    }
}