Как отсортировать массив по двум именам в JavaScript? - PullRequest
0 голосов
/ 08 марта 2012

Я видел вопросы и ответы о том, как отсортировать массив по одному значению (текст или число) и по двум числам (годам и количеству чего-либо).

Как мне отсортировать по одной строке в порядке возрастаниядругая строка в специальном порядке?

Вот один объект из массива

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 ]

5 голосов
/ 08 марта 2012

Метод 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() ожидает, что 0 будет возвращено, если a == b,<0, если <code>a < b и> 0, если a > b.

Вы можете увидеть это здесь;http://jsfiddle.net/32zPu/

2 голосов
/ 08 марта 2012

Я проголосовал за ответ Мэтта, но хотел добавить немного другой подход для получения порядка сортировки по типу, который может работать со значениями, превышающими только отдельные символы, и немного более короткий способ сравнения значений года:

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/

0 голосов
/ 08 марта 2012

Вы можете передать пользовательскую функцию в метод сортировки массива, который позволит вам определить, как сортируются элементы. Примерно так должно работать (ваши несортированные данные будут в var 'data'):

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...