如何在javascript中按两个名称排序数组?

时间:2012-03-08 13:22:51

标签: javascript sorting

我已经看到问题和答案如何按一个值(文本或数字)和两个数字(年份和数量)对数组进行排序。

如何按升序排序一个字符串,按特殊顺序排序另一个字符串?

这是数组

中的一个对象
var stop = {
    type: "S", // values can be S, C or H. Should ordered S, C and then H.
    street: "SW Dummy St." // Should be sorted in ascending order
}

预期最终结果应如下所示

var data = [
    { type: 'S', year: 'SW Karp' },
    { type: 'S', year: 'SW Walker' },
    { type: 'C', year: 'SW Greth' },
    { type: 'C', year: 'SW Main' }
    { type: 'H', year: 'SW Dummy' }
];

3 个答案:

答案 0 :(得分:5)

Array.sort()方法接受排序功能,允许您自己实现排序。

data.sort(function (a, b) {
    // Specify the priorities of the types here. Because they're all one character
    // in length, we can do simply as a string. If you start having more advanced
    // types (multiple chars etc), you'll need to change this to an array.
    var order = 'SCH';
    var typeA = order.indexOf(a.type);
    var typeB = order.indexOf(b.type);

    // We only need to look at the year if the type is the same
    if (typeA == typeB) {
        if (a.year < b.year) {
            return -1;
        } else if (a.year == b.year) {
            return 0;
        } else {
            return 1;
        }

    // Otherwise we inspect by type
    } else {
        return typeA - typeB;
    }
});

Array.sort()如果a == b,则要求返回0,&lt; 0如果a < b和&gt;如果a > b,则为0。

你可以在这里看到这个; http://jsfiddle.net/32zPu/

答案 1 :(得分:2)

我赞成了Matt的答案,但是想要添加一种稍微不同的方法来获取排序顺序,该排序顺序可以用于超出单个字符的值,并且比较年份值的方式更短:

data.sort(function(a, b) {
    var order = {"S": 1,"C": 2,"H": 3}, typeA, typeB;
    if (a.type != b.type) {
        typeA = order[a.type] || -1;
        typeB = order[b.type] || -1;
        return(typeA - typeB);
    } else {
        return(a.year.localeCompare(b.year));
    }
});

工作演示:http://jsfiddle.net/jfriend00/X3rSj/

答案 2 :(得分:0)

您可以将自定义函数传递给数组排序方法,该方法允许您定义项目的排序方式。这样的东西应该有效(你的未分类数据将在'data'var中):

function sortFunc (item1, item2) {
  var sortOrder = 'SCH';
  if (item1.type != item2.type)
  {
    return sortOrder.indexOf(item1.type) - sortOrder.indexOf(item2.type);
  }
  else
  {
    return item1.year.localeCompare(item2.year);
  }
}

var sortedData = data.sort(sortFunc);