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

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

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

这个错误完全正确。

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

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

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

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/

对于字符串,我这样做,

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)