Скажем, у меня есть массив, содержащий (случайным образом) и целые числа, и строковые элементы:
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 для выполнения этой задачи?
Подобно методу 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 и возвращаю значение, которое я могу использовать для сортировки (обратите внимание: я упорядочил значения, соответствующие фактическим номерам карт).
Вот один из возможных коротких подходов:
array.sort(function(a, b) {
return ref.indexOf(a) - ref.indexOf(b);
});
NB: Остерегайтесь того, что метод Array.prototype.indexOf
имеет ограниченную совместимость с браузером, поэтому при необходимости используйте прокладку. Однако у jQuery есть своя кросс-браузерная реализация, называемая $.inArray()
.