programing

배열을 정렬하는 TypeScript

linuxpc 2023. 3. 12. 10:32
반응형

배열을 정렬하는 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)

getByKeyfn은 이쪽

언급URL : https://stackoverflow.com/questions/21687907/typescript-sorting-an-array

반응형