只需使用Array.prototype.reduce,它通常是进行简单数学运算(例如获取平均值、范围或最小值-最大值)的最聪明方法
function max(...values) {
return values.reduce((prev, curr) => curr > prev ? curr : prev)
}
// or without the `...rest` parameter to use an array directly
function maxFromArr(values) {
return values.reduce((prev, curr) => curr > prev ? curr : prev)
}
这样你就有了一些干净高效的代码:
max(1, 2, 3, 8, 435, 32, 0) // => 432
// or for an array
const arr = [1, 2, 3, 72, 32, 0]
maxFromArray(arr) // => 74
// or
max(...arr) // => 74
常见的陷阱
比较数字时,通常总是测试阳性(is 而不是isNot)
测试阳性结果(is the current larger ? use current,而不是 is the current smaller ? use previous)也将自动处理任何无法转换为正确数字的项目(将数字与 NaN 进行比较将始终返回 false。例如,12 < NaN 和 12 > NaN 都返回 false)。
如果你反过来做,你可能会得到一个令人惊讶的结果:
(随意在任何操场上运行这个 sn-p)
function max (...values: number[]) {
return values.reduce((prev, curr) => curr > prev ? curr : prev)
}
function naïveMax (...values: number[]) {
// notice were testing for a negativ: is the current smaller ?
// if it **isn't**, use the current
return values.reduce((prev, curr) => curr < prev ? prev : curr)
}
const arr1 = [1, 21, 3, 12, 2]
console.log(max(...arr1)) // => 21
console.log(naïveMax(...arr1)) // => 21
// looking good so far
const arr2 = [89, -21, 32, {}, 342]
console.log(max(...arr2)) // => 342
console.log(naïveMax(...arr2)) // => 242
// looks still ok, despite an object being mixed in, but
const arr3 = [64, 2, 3, 95, 32, {}]
console.log(max(...arr3)) // => 95
console.log(naïveMax(...arr3)) // => {}
// whoops, the largest number suddenly is the object
为了完整起见,这里是min
function min(...values) {
// again, test for a positive to filter `NaN`-values
return values.reduce((prev, curr) => curr < prev ? curr : prev)
}