Как отсортировать элементы в массиве, содержащем как строку, так и целые числа?

0

Скажем, у меня есть массив, содержащий (случайным образом) и целые числа, и строковые элементы:

var array = ["T", 5, 2, 9, "A"];

Возможные элементы или ссылки:

var ref = ["A", "K", "Q", "J", "T", 9, 8, 7, 6, 5, 4, 3, 2];

Где A - самый высокий (самый ценный), K второй самый ценный и так далее. Как показывает большинство из вас, это разные карты в колоде карт.

Как следует и сортировать мой array выше, чтобы получить результат:

array = ["A", "T", 9, 5, 2];

Поскольку я пытаюсь изучить javascript, я бы предпочел чистое решение для javascript, но мне также интересно, есть ли функция jQuery для выполнения этой задачи?

  • 2
    «чистый javascript» является неправильным. Никогда не говори эту фразу снова.
  • 0
    @BradM Могу я спросить, почему? В качестве примера, JSFiddle использует именно эту фразу.
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Подобно методу VisionN, здесь можно избежать необходимости в indexOf. Я заменил ссылочный массив литералом объекта (примечание: это выглядит странно):

var array = ["T", 5, 2, 9, "A"];
var ref = {A:14, K:13, Q:12, J:11, T:10, 9:9, 8:8, 7:7, 6:6, 5:5, 4:4, 3:3, 2:2};

array.sort(function(a, b) {
    return ref[b] - ref[a];
});

console.log(array);

скрипка

Теперь вместо использования indexOf я использую значение из массива как индекс в объекте ref и возвращаю значение, которое я могу использовать для сортировки (обратите внимание: я упорядочил значения, соответствующие фактическим номерам карт).

  • 0
    Огромное спасибо! Именно то, что я хотел узнать, как это сделать! Мне нравится, что вы заменили массив на литерал объекта, для некоторых он может показаться «странным», но для меня это становится более простым для понимания.
7

Вот один из возможных коротких подходов:

array.sort(function(a, b) {
    return ref.indexOf(a) - ref.indexOf(b);
});

NB: Остерегайтесь того, что метод Array.prototype.indexOf имеет ограниченную совместимость с браузером, поэтому при необходимости используйте прокладку. Однако у jQuery есть своя кросс-браузерная реализация, называемая $.inArray().

  • 0
    Спасибо за ваш ответ, в частности, связанный с "NB" контент и информацию о jQuery. +1 за это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню