我一直在尝试解决我在使用typescript时遇到的一个非常奇怪的问题。它将内联布尔表达式视为第一个值的类型,而不是完整的表达式。
因此,如果您尝试如下所示的简单操作:
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
您将在排序方法上得到一个错误,指出参数与调用目标的任何签名都不匹配,因为您的结果是数值而不是布尔值。我想我遗漏了一些东西,因为我非常确定n1>n2是一个布尔语句。
发布于 2014-02-11 05:08:21
这个错误是完全正确的。
正如它试图告诉您的那样,.sort()
接受返回数字的函数,而不是返回布尔值的函数。
如果第一项较小,则需要返回负数;如果第一项较大,则返回正数;如果它们相等,则返回零。
发布于 2014-02-11 06:31:29
数字
在对数字进行排序时,可以使用紧凑比较:
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;
});
发布于 2016-09-10 14:56:37
答案很好,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;
}
如果它更具动态性,也可以让里面的值作为变量n1field和n2field,只要保持字符串和数字之间的差异即可。
https://stackoverflow.com/questions/21687907
复制相似问题