Сортировка текста по массиву
Я пытался выяснить очень странную проблему, с которой я столкнулся с typescript. Он рассматривал встроенное логическое выражение как любой тип первого значения вместо полного выражения.
Так что если вы попробуете что-то простое, вроде этого:
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
вы получите сообщение об ошибке в вашем методе сортировки о том, что параметры не соответствуют никакой сигнатуре цели вызова, потому что ваш результат является числовым, а не Логический. Я думаю, что я что-то упускаю, потому что я уверен, что n1>n2-это логическое утверждение.
5 ответов:
ошибка полностью верна.
как он пытается вам сказать,
.sort()
принимает функцию, которая возвращает число, а не логическое.вам нужно вернуть отрицательный, если первый элемент меньше; положительный, если он больше, или ноль, если они равны.
при сортировке чисел можно использовать компактное сравнение:
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11]; var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
т. е.
-
, а не<
.если вы сравниваете что-нибудь еще, вам нужно будет преобразовать сравнение в число.
var stringArray: string[] = ['AB', 'Z', 'A', 'AC']; var sortedArray: string[] = stringArray.sort((n1,n2) => { if (n1 > n2) { return 1; } if (n1 < n2) { return -1; } return 0; });
большой Sohnee ответа. Хотелось бы добавить, что если у вас есть массив объектов, и вы хотите сортировать по ключу, то его почти то же самое, это пример того, что можно сортировать по дате(номеру) или названию (строке):
if (sortBy === 'date') { return n1.date - n2.date } else { if (n1.title > n2.title) { return 1; } if (n1.title < n2.title) { return -1; } return 0; }
может также сделать значения внутри как переменные n1 [поле] против n2[поле], если его более динамичным, просто держите разницу между строками и числами.
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11]; var sortFn = (n1 , n2) => number { return n1 - n2; } var sortedArray: number[] = numericArray.sort(sortFn);
Как сортировать смешанный (алфавиты + числа) массив
// Array of Objects builds = [ { id: 1, name: 'Build 91'}, { id: 2, name: 'Build 32' }, { id: 3, name: 'Build 13' }, { id: 4, name: 'Build 24' }, { id: 5, name: 'Build 5' }, { id: 6, name: 'Build 56' } ] // objects are being sorted sortedBuilds = builds.sort((n1, n2) => { return this.naturalCompare(n1.name, n2.name) }) // if you need reverse order, just add .reverse() sortedBuilds.reverse() // result would be // { id: 5, name: 'Build 5' }, // { id: 3, name: 'Build 13' }, // { id: 4, name: 'Build 24' }, // { id: 2, name: 'Build 32' }, // { id: 6, name: 'Build 56' }, // { id: 1, name: 'Build 91'}, // don't try to understand this method, just use it as it is and you'll get the result naturalCompare(a, b) { var ax = [], bx = []; a.replace(/(\d+)|(\D+)/g, function (_, , ) { ax.push([ || Infinity, || ""]) }); b.replace(/(\d+)|(\D+)/g, function (_, , ) { bx.push([ || Infinity, || ""]) }); while (ax.length && bx.length) { var an = ax.shift(); var bn = bx.shift(); var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]); if (nn) return nn; } return ax.length - bx.length; }