【问题标题】:Function to find highest value from an array of values, not using `Math.max()`从值数组中查找最大值的函数,不使用“Math.max()”
【发布时间】:2020-10-11 17:36:56
【问题描述】:

我想创建一个函数来从一组值中找到最高/最大值。
例如:numbers = [2, 24, 48, 9, 15, 41].
除了Math.max(),还能怎么办?

【问题讨论】:

  • 你已经尝试了什么?您面临哪些具体问题?感谢您考虑How do I ask a good question?How to create a Minimal, Reproducible Example
  • 欢迎您!我假设 JavaScript 并将其添加到问题的标签中。如果没有就改变。谢谢你,祝你好运!
  • 您可以通过for循环、forEachreduce...来遍历数组值。
  • 您需要与之前存储的值进行比较,因此,我将初始 max 变量设置为 -Infinity
  • 思考练习:你会如何在头脑中/在纸上做到这一点?

标签: javascript arrays function max


【解决方案1】:

试试这个:

function maxVal(array){
    let indexOfMax = 0;
    for (let i = 0; i < array.length; i++){
        if (array[i] > array[indexOfMax]){
            indexOfMax = i;
        }
    }
    return array[indexOfMax];
}

【讨论】:

  • 不错!为什么不直接存储最大值? (数组可以为空 = 您的代码有问题,但提问者没有明确要求)。
  • @iAmOren 这是另一种可能性。我认为这个人在另一种情况下也可能会发现返回索引很有用,所以我希望他们手头有它。
  • 好主意!提问者应该展示尝试,不要让我们猜测也不要做这项工作......
【解决方案2】:

只需使用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 &lt; NaN12 &gt; 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)
}

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2022-01-15
    • 2012-08-14
    • 2010-09-18
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多