优雅地同时计算一个数字数组的最小值和最大值

Tim*_*mmm 2 javascript arrays numbers max min

在Javascript中,给定一个简单的number[]数组,是否有一种优雅的方法可以同时计算最小值和最大值,或者undefined如果数组为空则返回?

像这样的东西:

const a = [1, 2, 3];
const (min, max) = minMax(a);
Run Code Online (Sandbox Code Playgroud)

先发制人的回应说明:

  1. 不是这个问题的重复,因为他实际上不是在计算同一个数组的最小值和最大值,而是计算 4 个不同数组的最小值最大值。

  2. 我想一次性计算这些。不是[Math.min(a), Math.max(a)]

  3. 我知道如何做明显的方式:

let min = undefined;
let max = undefined;
for (const x of array) {
  min = min === undefined ? x : Math.min(min, x);
  max = max === undefined ? x : Math.max(max, x);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更优雅的东西,例如使用Array.reduce().

kfe*_*v91 5

使用Array.reduce并且只迭代一次数组。我正在使用数组析构赋值从函数传回minmax值(因为 JS 没有元组类型)。我还在检查数组是否为空的边缘情况:

function minMax(array) {
  if (array.length == 0) {
    return [undefined, undefined];
  }
  return array.reduce(([min, max], val) => {
    return [Math.min(min, val), Math.max(max, val)];
  }, [Number.MAX_VALUE, Number.MIN_VALUE]);
}

function testMinMax(array) {
  let [min, max] = minMax(array);
  console.log(min, max);
}

testMinMax([]); // logs "undefined undefined"
testMinMax([1]); // logs "1 1"
testMinMax([1, 2, 3, 4, 5]); // logs "1 5"
Run Code Online (Sandbox Code Playgroud)


Kla*_*con 5

您可以使用Array.reduce()减少到任何类型的结果,它不必是相同的类型。例如,将一个数字数组缩减为一个包含两个数字 min 和 max 的输出数组:

const minMax = arr => 
  arr.reduce(([min,max=min],num) => [Math.min(num,min),Math.max(num,max)], arr);

const a = [5,2,6,3,3,1,1];
const [min,max] = minMax(a);

console.log("min",min,"max",max);
Run Code Online (Sandbox Code Playgroud)

reduce种植有数组本身,为了简洁和因为别的有点不必要。由于解构,这会弄乱长度为 1 的数组,因此max=min用于设置max等于第一个元素作为后备。因此处理数组长度为 1 或 0 的情况。