Min & max value of a numeric array
When working with numeric arrays in JavaScript, you might find yourself in need of finding the minimum or maximum value. Luckily, JavaScript’s Math
built-in object has got you covered. You can simply use Math.min()
or Math.max()
combined with the spread operator (...
), as both functions accept any number of arguments.
代码实现
const nums = [2, 4, 6, 8, 1, 3, 5, 7];
Math.max(...nums); // 8
Math.min(...nums); // 1
N min & max values of a numeric array
What if you need to find the n
minimum or maximum values? Turns out it’s almost as easy.
For either one of the operations, we’ll first need to sort the array in ascending or descending order. This can be done using Array.prototype.sort()
and the appropriate comparator function. However, we’ll need to create a shallow clone of the array first using the spread operator (...
) to avoid mutating the original array.
Then, we can use Array.prototype.slice()
to get the first n
elements of the sorted array. If n
is not provided, we’ll get the first element of the array. If n
is greater than or equal to the length of the array, we’ll get the original array back.
使用样例
const minN = (arr, n = 1) => [...arr].sort((a, b) => a - b).slice(0, n);
const maxN = (arr, n = 1) => [...arr].sort((a, b) => b - a).slice(0, n);
minN([1, 2, 3]); // [1]
minN([1, 2, 3], 2); // [1, 2]
maxN([1, 2, 3]); // [3]
maxN([1, 2, 3], 2); // [3, 2]
Min & max value of an array based on function
For more complex cases, such as finding the min/max value in an array of objects, you will have to use Array.prototype.map()
. Given an appropriate function or a property name, you can map the array to an array of values and then use the same approach as above.
const minBy = (arr, fn) =>
Math.min(...arr.map(typeof fn === 'function' ? fn : val => val[fn]));
const maxBy = (arr, fn) =>
Math.max(...arr.map(typeof fn === 'function' ? fn : val => val[fn]));
minBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], x => x.n); // 2
minBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 2
maxBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], x => x.n); // 8
maxBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 8