TypeScript排序数组

Ken*_*per 115 typescript

我一直试图弄清楚我遇到的一个非常奇怪的问题.它将内联布尔表达式视为第一个值的类型而不是完整表达式.

所以如果你尝试像下面那样简单的东西:

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

var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
Run Code Online (Sandbox Code Playgroud)

试试吧

您的排序方法会出现错误,指出参数与调用目标的任何签名都不匹配,因为您的结果是数字而不是布尔值.我想我错过了一些东西虽然因为我很确定n1> n2是一个布尔语句.

Fen*_*ton 178

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

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

var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
Run Code Online (Sandbox Code Playgroud)

-而不是<.

如果您要比较其他任何内容,则需要将比较转换为数字.

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;
});
Run Code Online (Sandbox Code Playgroud)

  • 在第二种情况下,您可以使用 localeCompare() 比较当前语言环境中的字符串,它返回一个数字 (3认同)
  • 没关系 :).刚看了一下ascii图表. (2认同)

SLa*_*aks 147

错误完全正确.

正如它试图告诉你的那样,.sort()需要一个返回数字的函数,而不是布尔值.

如果第一项较小,则需要返回否定值; 如果它更大则为正,如果它们相等则为零.

  • 这就是我们使用TypeScript的原因!:-) (45认同)

yai*_*niz 22

伟大的答案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;
    }
Run Code Online (Sandbox Code Playgroud)

也可以将值设置为变量n1 [field] vs n2 [field],如果它更动态,只需保持字符串和数字之间的差异.

  • @Nicktar它可能是作为格式的答案发布的.但无论如何它都没有任何伤害 (5认同)

Yoa*_*man 9

let numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];

let sortFn = (n1 , n2) => number { return n1 - n2; }

const sortedArray: number[] = numericArray.sort(sortFn);
Run Code Online (Sandbox Code Playgroud)

  • 您可以在代码中添加一些信息吗? (2认同)
  • 谢谢!我为此进行了更改:myArray.sort((a,b):number =&gt; {return a.NumberProp-b.NumberProp;}); (2认同)

Was*_*siF 8

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

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)
Run Code Online (Sandbox Code Playgroud)


Raf*_*ter 6

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

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

var sorrtedArray:Array<number> = numericArray.sort((n1,n2) => n1 - n2);
Run Code Online (Sandbox Code Playgroud)

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