Сортировка текста по массиву


Я пытался выяснить очень странную проблему, с которой я столкнулся с typescript. Он рассматривал встроенное логическое выражение как любой тип первого значения вместо полного выражения.

Так что если вы попробуете что-то простое, вроде этого:

var numericArray:Array<number> = [2,3,4,1,5,8,11];

var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);

TryIt

вы получите сообщение об ошибке в вашем методе сортировки о том, что параметры не соответствуют никакой сигнатуре цели вызова, потому что ваш результат является числовым, а не Логический. Я думаю, что я что-то упускаю, потому что я уверен, что n1>n2-это логическое утверждение.

5 70

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;
}