Use the sort() Method to Sort Array in TypeScript The sort() method returns the result in ascending order by default. The array type is to be defined as string[] . The sort() method returns the string array, and the array elements are given in alphabetical order as an output.
When sorting numbers, you can use the compact comparison:
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
i.e. -
rather than <
.
If you are comparing anything else, you'll need to convert the comparison into a number.
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;
});
For objects, you can sort based on a property, bear in mind the above information about being able to short-hand number types. The below example works irrespective of the type.
var objectArray: { age: number; }[] = [{ age: 10}, { age: 1 }, {age: 5}];
var sortedArray: { age: number; }[] = objectArray.sort((n1,n2) => {
if (n1.age > n2.age) {
return 1;
}
if (n1.age < n2.age) {
return -1;
}
return 0;
});
The error is completely correct.
As it's trying to tell you, .sort()
takes a function that returns number, not boolean.
You need to return negative if the first item is smaller; positive if it it's larger, or zero if they're equal.
Great answer Sohnee. Would like to add that if you have an array of objects and you wish to sort by key then its almost the same, this is an example of one that can sort by both date(number) or title(string):
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;
}
Could also make the values inside as variables n1[field] vs n2[field] if its more dynamic, just keep the diff between strings and numbers.
let numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
let sortFn = (n1 , n2) => number { return n1 - n2; }
const sortedArray: number[] = numericArray.sort(sortFn);
Sort by some field:
let arr:{key:number}[] = [{key : 2}, {key : 3}, {key : 4}, {key : 1}, {key : 5}, {key : 8}, {key : 11}];
let sortFn2 = (obj1 , obj2) => {key:number} { return obj1.key - obj2.key; }
const sortedArray2:{key:number}[] = arr.sort(sortFn2);
function naturalCompare(a, b) {
var ax = [], bx = [];
a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
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;
}
let 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' }
]
let sortedBuilds = builds.sort((n1, n2) => {
return naturalCompare(n1.name, n2.name)
})
console.log('Sorted by name property')
console.log(sortedBuilds)
The easiest way seems to be subtracting the second number from the first:
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2) => n1 - n2);
https://alligator.io/js/array-sort-numbers/
i use this
type SortArrayType = <T>(arr: T[]) => T[];
const sortArray: SortArrayType = (arr) => {
return arr.sort((a, b) => {
const strA = JSON.stringify(a);
const strB = JSON.stringify(b);
if (strA < strB) {
return -1;
}
if (strA > strB) {
return 1;
}
return 0;
});
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With