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)
SLa*_*aks 147
错误完全正确.
正如它试图告诉你的那样,.sort()需要一个返回数字的函数,而不是布尔值.
如果第一项较小,则需要返回否定值; 如果它更大则为正,如果它们相等则为零.
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],如果它更动态,只需保持字符串和数字之间的差异.
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)
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)
最简单的方法似乎是减去第一个数字:
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/
| 归档时间: |
|
| 查看次数: |
205419 次 |
| 最近记录: |