TypeScript对数组排序

pdtvr36n  于 2023-06-24  发布在  TypeScript
关注(0)|答案(9)|浏览(193)

我一直在试图找出一个非常奇怪的问题,我遇到了 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是一个布尔语句。

a64a0gku

a64a0gku1#

编号

在对数字排序时,可以使用紧凑比较:

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

j2cgzkjk2#

错误是完全正确的。
正如它试图告诉你的,.sort()接受一个返回数字的函数,而不是布尔值。
如果第一项较小,则需要返回负数;如果它更大则为正,如果它们相等则为零。

hujrc8aj

hujrc8aj3#

伟大的回答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]和n2[field]更动态,也可以使里面的值作为变量n1[field] vs n2[field],只是保持字符串和数字之间的差异。

rlcwz9us

rlcwz9us4#

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);
9jyewag0

9jyewag05#

排序混合数组(字母和数字)

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)
yi0zb3m4

yi0zb3m46#

最简单的方法似乎是从第一个数字中减去第二个数字:

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

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

https://alligator.io/js/array-sort-numbers/

093gszye

093gszye7#

我用这个

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

ruoxqz4g8#

对于弦我这样做,

let unSortedArray = ['d', 'b', 'c', 'a'];
let sortedArray = unSortedArray.sort((x, y) => x > y ? 1 : x < y ? -1 : 0)

其可以容易地扩展到更复杂的类型,例如,字典在这种情况下,使用x.whicheverKey, y.whicheverKey代替x, y,例如

unSortedObjectArray.sort((x, y) => x.whicheverKey > y.whicheverKey ? 1 : x.whicheverKey < y.whicheverKey ? -1 : 0)
jm2pwxwz

jm2pwxwz9#

我今天在尝试用TypeScript重新创建_.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在此找到

相关问题