查找数组的最小值和最大值
Posted
技术标签:
【中文标题】查找数组的最小值和最大值【英文标题】:Find min and max value of array 【发布时间】:2021-09-15 17:39:56 【问题描述】:我之前创建了一个从 0 到 100 的随机数数组,并且需要创建一个从数组中获取最小和最大数的函数。我无法理解它的解决方案;
let randomNumbers = [];
for (let i = 0; i < 100; i++)
randomNumbers.push(Math.round(Math.random() * 100));
console.log(...randomNumbers);
function getMaxMin(numbers) // when declaring numbers in the brackets here, what are we doing? Max and min are defined later so does returning min and max as done later push two values to the function?
let max = numbers[0];
let min = numbers[0];
/*for (let i = 0; i < numbers.length - 1; i++) // why - 1?
if (numbers[i] > max)
max = numbers[i]
if (numbers[i]< min)
min = numbers[i]
*/
for (let number of numbers)
max = number > max ? number : max;
min = number < min ? number : min;
return max, min ;
console.log(getMaxMin(randomNumbers));
我在代码中包含了一些问题,但老实说,我正在努力解决函数问题并找到正确的方法来询问我不明白的内容。函数中的(数字),我看到在这些括号中输入了不同的东西,但不明白这部分代码的作用。如果有人可以对流程中的每个步骤进行一些细分,我将不胜感激。
【问题讨论】:
您从哪里获得解决方案? w3schools.com/js/js_function_parameters.asp 来自我正在学习的课程 【参考方案1】:function getMaxMin(numbers)
的numbers
部分是getMaxMin
函数接受的参数。此变量只能在 getMaxMin
函数范围内访问。
在底部的全局范围内,当调用getMaxMin(randomNumbers)
时,您将randomNumbers
的值传递给函数,然后函数以该值作为局部变量numbers
的值执行。
函数部分:
for (let number of numbers)
max = number > max ? number : max;
min = number < min ? number : min;
可以这样读:
"对于可迭代 numbers
中的每个 number
,执行以下操作:
-
如果
number
大于max
,则将max
的值设置为number
,否则将max
的值设置为max
(什么都不做)
如果number
小于min
,则将min
的值设置为number
,否则将min
的值设置为min
(什么都不做)
"
退房:
https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Statements/for...of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions【讨论】:
谢谢大家,我开始理解它了,但是在代码的 min 和 max 部分苦苦挣扎,我看到 max = 如果 number 的值大于 max 的值,则返回该值数量,如果不是最大值......但是在哪里声明了最大值?同样与 min 我不明白这已被宣布为能够与之比较。我读了它,因为我们将 max 和 min 声明为两个数值,创建一个 for 循环来说明该数字是否大于它本身显示该数字,我希望你看到我是如何看待它的? 是的,max
和 min
在函数顶部使用 let
关键字声明,将它们的初始值都设置为数组中的第一个数字。【参考方案2】:
您在此处注释function getMaxMin(numbers)
numbers
的行是getMaxMin
函数的参数。稍后当您在console.log()
中调用此函数时,像这样console.log(getMaxMin(randomNumbers));
那里randomNumbers
是作为参数传递给getMaxMin
函数的实际值。而这个randomNumbers
是你之前生成的随机数数组。
因此,在函数声明行(您的注释行)中,您实际上并没有传递任何东西。您只是获得了参数的名称。这意味着,如果将某些内容作为参数传递给此函数,则在此函数内部,该参数将被识别为numbers
。
【讨论】:
【参考方案3】:在这里括号中声明数字时,我们在做什么?
我们将numbers
数组作为参数传递给函数getMaxMin
。
Max 和 min 是稍后定义的,那么返回 min 和 max 之后是否会将两个值推送给函数?
最后,我们成功找到了最小值和最大值,因此我们将其返回到 object
。
为什么 - 1?
在我看来numbers.length - 1
是一个错误。通过这样做,我们不会比较数组的最后一个元素。这可能是最大/最小的元素。
如果仍然必须存在-1
,那么我们可以这样修改条件
for (let i = 0; i <= numbers.length - 1; i++)
要了解这样做的逻辑:
我们采用两个variables
、max
和min
。我们将它们都初始化为等于数组的第一个元素。
当我们遍历数组时,我们会在每一步检查当前数字是否大于/小于max
或min
。
如果它更大,我们使max
等于它。
如果它更小,我们让min
等于它。
参考这些链接以获得更多理解:
函数参数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function
Javascript 中的三元运算符:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
【讨论】:
【参考方案4】:对我来说,在没有数组的最后一个元素的情况下进行迭代,直到该元素成为比较的起始值,这看起来像是一个错误。
let max = numbers[numbers.length - 1]; // use last
let min = max; // use last
for (let i = 0; i < numbers.length - 1; i++) // iterate without last
if (numbers[i] > max) max = numbers[i];
if (numbers[i] < min) min = numbers[i];
保留for
语句块的更好方法是,从索引1 开始迭代,直到数组的长度更小,并将第一个元素作为起始值。
let max = numbers[0]; // use first
let min = max; // use first
for (let i = 1; i < numbers.length; i++) // iterate without first
if (numbers[i] > max) max = numbers[i];
if (numbers[i] < min) min = numbers[i];
为了完整性,通过spreading ...
数组的元素或其他iterables,以及Math.min
或Math.max
,您无需手动迭代即可获得想要的结果。
【讨论】:
以上是关于查找数组的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章
在给定数组中查找最小值和最大值,其中约束应最小值索引应小于其最大值
Javascript:使用 reduce() 查找最小值和最大值?
从 p5.js 的 JSON 文件中的数组中查找最小值和最大值