我一直在试图解决我在打字时遇到的一个非常奇怪的问题。它将内联布尔表达式视为第一个值的类型,而不是完整的表达式。

所以如果你尝试以下简单的方法:

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

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

试一试

您将在排序方法上得到一个错误,表示参数与调用目标的任何签名不匹配,因为您的结果是数值而不是布尔值。我想我漏掉了一些东西,因为我很确定n1>n2是一个布尔命题。


当前回答

对于字符串,我这样做,

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

它可以很容易地扩展到更复杂的类型,例如字典。在这种情况下,使用x.喜怒无常,y.喜怒无常。

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

其他回答

我用这个

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.喜怒无常。

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

我今天在尝试重新创建_时写了这篇文章。sortBy在TypeScript中,我想我会把它留给任何需要的人。

// ** 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的强制转换扩展{}>,以及使用T[]输入形参和函数返回类型。

const x = [{ label: 'anything' }, { label: 'goes'}]
const sorted = sortBy('label', x)

** getByKey fn在这里找到

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

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)

这个错误完全正确。

正如它试图告诉您的那样,.sort()接受一个返回number而不是boolean的函数。

如果第一项更小,则需要返回负数;如果更大则为正,如果相等则为零。