在Javascript中从数组中获取最小值?

IT技术 javascript arrays min
2021-01-21 07:41:19

数组 justPrices 具有如下值:

[0] = 1.5
[1] = 4.5
[2] = 9.9.

如何返回数组中的最小值?

6个回答

找到最小值的最简洁的表达代码可能是rest 参数

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = Math.min(...arr)
console.log(min)


Function.prototype.apply当您不需要更改函数的上下文时,Rest 参数本质上是一种方便的简写

var arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
var min = Math.min.apply(Math, arr)
console.log(min)


这也是一个很好的用例Array.prototype.reduce

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = arr.reduce((a, b) => Math.min(a, b))
console.log(min)

Math.min直接传递可能很诱人reduce,但是回调会接收额外的参数:

callback (accumulator, currentValue, currentIndex, array)

在这种特殊情况下,它可能有点冗长。reduce当您有一组复杂的数据要聚合成单个值时,这尤其有用:

const arr = [{name: 'Location 1', distance: 14}, {name: 'Location 2', distance: 58}, {name: 'Location 3', distance: 20}, {name: 'Location 4', distance: 77}, {name: 'Location 5', distance: 66}, {name: 'Location 6', distance: 82}, {name: 'Location 7', distance: 42}, {name: 'Location 8', distance: 67}, {name: 'Location 9', distance: 42}, {name: 'Location 10', distance: 4}]
const closest = arr.reduce(
  (acc, loc) =>
    acc.distance < loc.distance
      ? acc
      : loc
)
console.log(closest)


当然,您始终可以使用经典迭代:

var arr,
  i,
  l,
  min

arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
min = Number.POSITIVE_INFINITY
for (i = 0, l = arr.length; i < l; i++) {
  min = Math.min(min, arr[i])
}
console.log(min)

...但即使是经典的迭代也可以进行现代改造:

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
let min = Number.POSITIVE_INFINITY
for (const value of arr) {
  min = Math.min(min, value)
}
console.log(min)

此答案中解释的第一部分(不是代码)令人困惑/不正确。声明“Rest 参数本质上是 Function.prototype.apply 的便捷简写”应该替换为:解构赋值语法 ( ...arr) 是一个 JavaScript 表达式,它可以将值从数组(或来自对象的属性)解包到不同的变量中. 因此,Math.min(...arr)是一个将数组扩展为不同变量解构赋值
2021-03-29 07:41:19

Jon Resig 在本文中说明了如何通过扩展 Array 原型并调用底层Math.min方法来实现这一点,不幸的是,该方法不接受数组而是可变数量的参数:

Array.min = function( array ){
    return Math.min.apply( Math, array );
};

接着:

var minimum = Array.min(array);
@MarekSebera,虽然我喜欢扩展Array.prototype自己,但我建议谨慎行事for..in除了编号索引之外,循环还可以获取函数,粗心的程序员很容易破坏代码。
2021-03-15 07:41:19
@MarekSebera,我没有写这篇文章,我只是链接到它。问 John Resig 为什么。
2021-03-17 07:41:19
有什么理由不推荐原型设计吗?
2021-03-28 07:41:19
@DavsketArray.prototype.sort将通过更改所有索引来影响原始数组对象,而有效Array.prototype.min函数不会产生此类副作用。
2021-04-08 07:41:19
@Davsket Math.min 是 O(N),其中排序是 O(N log N)。它很可爱,但速度较慢;在大型阵列上要慢得多。
2021-04-11 07:41:19

我发现返回数组最小值的最简单方法是在 Math.min() 函数上使用扩展运算符。

return Math.min(...justPrices);
//returns 1.5 on example given 

MDN 上的页面有助于更好地理解它:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min

一点额外:这也适用于 Math.max() 函数

返回 Math.max(...justPrices); //在给定的示例中返回 9.9。

希望这可以帮助!

最佳答案在这里!
2021-04-05 07:41:19

更新:使用 Darin 的 / John Resig 答案,请记住,您不需要为 指定 thisArg min,因此Math.min.apply(null, arr)会正常工作。


或者您可以数组进行排序并获得值 #1: [2,6,7,4,1].sort()[0]

[!] 但如果不提供自定义数字排序功能,这只适用于一种非常有限的情况:小于 10 的正数看看它会如何破裂:

var a = ['', -0.1, -2, -Infinity, Infinity, 0, 0.01, 2, 2.0, 2.01, 11, 1, 1e-10, NaN];

// correct: 
a.sort( function (a,b) { return a === b ? 0 : a < b ? -1: 1} );
//Array [NaN, -Infinity, -2, -0.1, 0, "", 1e-10, 0.01, 1, 2, 2, 2.01, 11, Infinity]

// incorrect:
a.sort();
//Array ["", -0.1, -2, -Infinity, 0, 0.01, 1, 11, 1e-10, 2, 2, 2.01, Infinity, NaN]

而且,array 就地更改,这可能不是您想要的。

或者 [2,6,7,4,1].sort()[0] 如果你想保留数组对象
2021-03-26 07:41:19
“小于 10 的正数” - 为什么?它是否默认使用字符串比较?
2021-03-31 07:41:19

ES6 是未来之路。

arr.reduce((a, b) => Math.min(a, b));

我更喜欢这种形式,因为它很容易推广到其他用例

砰……答案是最小而不是最大;)
2021-03-27 07:41:19
也许这个问题是错误的,它是最大的......已经回答了两次,两次是为了最大......只是说`¯\_(ツ)_/¯
2021-04-12 07:41:19