배열을 정렬하는 TypeScript
타이프 원고에서 마주친 아주 이상한 문제를 알아내려고 노력했어요.인라인 부울식을 완전한 식 대신 첫 번째 값의 유형이 무엇이든 취급하고 있었습니다.
따라서 다음과 같은 간단한 작업을 시도하면 다음과 같습니다.
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
결과가 부울이 아닌 수치이기 때문에 파라미터가 콜타깃의 시그니처와 일치하지 않는다는 에러가 소트 메서드에 표시됩니다.n1>n2가 부울문이라고 확신하기 때문에 뭔가 부족한 것 같습니다.
숫자
숫자를 정렬할 때 다음과 같은 콤팩트 비교를 사용할 수 있습니다.
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;
});
물건들
객체의 경우 속성에 따라 정렬할 수 있습니다.단기 번호 유형을 사용할 수 있는 것에 대한 위의 정보에 유의하십시오.다음 예시는 유형에 관계없이 작동합니다.
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;
});
오류는 완전히 수정되었습니다.
그게 말하려고 하는 것처럼.sort()
는 부울이 아닌 숫자를 반환하는 함수를 사용합니다.
첫 번째 항목이 작으면 음수, 크면 양수, 같으면 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[field] vs n2[field]로 설정할 수도 있습니다.더 동적인 경우 문자열과 숫자 사이의 차이만 유지합니다.
let numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
let sortFn = (n1 , n2) => number { return n1 - n2; }
const sortedArray: number[] = numericArray.sort(sortFn);
필드별로 정렬:
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)
가장 쉬운 방법은 첫 번째 숫자에서 두 번째 숫자를 빼는 것입니다.
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/
나는 이것을 사용한다.
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;
});
};
현악기 이런 거 하면
let unSortedArray = ['d', 'b', 'c', 'a'];
let sortedArray = unSortedArray.sort((x, y) => x > y ? 1 : x < y ? -1 : 0)
더 복잡한 유형(예: 사전)으로 쉽게 확장할 수 있습니다.그 경우 대신x, y
사용하다x.whicheverKey, y.whicheverKey
예.
unSortedObjectArray.sort((x, y) => x.whicheverKey > y.whicheverKey ? 1 : x.whicheverKey < y.whicheverKey ? -1 : 0)
제가 오늘 이 곡을 쓴 이유는_.sortBy
필요한 사람을 위해 남겨두려고 했어요.
// ** Credits for getKeyValue at the bottom **
export const getKeyValue = <T extends {}, U extends keyof T>(key: U) => (obj: T) => obj[key]
export const sortBy = <T extends {}>(index: string, list: T[]): T[] => {
return list.sort((a, b): number => {
const _a = getKeyValue<keyof T, T>(index)(a)
const _b = getKeyValue<keyof T, T>(index)(b)
if (_a < _b) return -1
if (_a > _b) return 1
return 0
})
}
사용방법:
범용 타입 T의 배열을 상정하고 있기 때문에, 그 때문에, 캐스트는<T extends {}>
파라미터 및 함수 반환 유형을 입력합니다.T[]
const x = [{ label: 'anything' }, { label: 'goes'}]
const sorted = sortBy('label', x)
getByKey
fn은 이쪽
언급URL : https://stackoverflow.com/questions/21687907/typescript-sorting-an-array
'programing' 카테고리의 다른 글
AngularJ는 루트 변경 시 보류 중인 $http 요구를 모두 중단합니다. (0) | 2023.03.17 |
---|---|
각도 있는 프로젝트 아키텍처 (0) | 2023.03.12 |
WooCommerce 4+에서 제품에 커스텀 재고 상태를 추가하는 방법 (0) | 2023.03.12 |
Oracle PL/SQL에 문자열을 분할하는 기능이 있습니까? (0) | 2023.03.12 |
JavaScript에서 날짜 개체를 수신하기 위해 JSON을 구문 분석하는 방법은 무엇입니까? (0) | 2023.03.12 |