怎样运用JS,在一个Number
范例的数组里,查找最大(或最小)数呢?
以下引见五个要领。(假如有新要领,后续会更新,也迎接列位留言供应新要领)
1. 不运用任何库函数
代码以下:
function findMax1 (arr) {
let result = 0;
if (Array.isArray(arr) && arr.length > 0) {
for (let i = 0; i < arr.length; i++) {
result = arr[i] > result ? arr[i] : result;
}
return result;
} else {
throw new ReferenceError('The parameter arr is invalid');
}
}
诠释:
运用一个变量result
来存储最大值。遍历待查找的数组,假如当前遍历的元素大于result
,就把这个元素赋值给result
。
假如求最小值,将arr[i] > result ? arr[i] : result;
改成arr[i] < result ? arr[i] : result;
。
2. 运用Array.reduce()
代码以下:
function findMax2 (arr) {
let result = 0;
if (Array.isArray(arr) && arr.length > 0) {
result = arr.reduce((a, b) => {
return a > b ? a : b;
}, 0);
return result;
} else {
throw new ReferenceError('The parameter arr is invalid');
}
}
诠释:
reduce
要领就是经由过程一个函数,针对一个累加器(accumulator)和数组中的每个元素,将一个数组终究削减到一个值。
reduce
接收两个参数:
第一个是
callback
,就是谁人前面提到的谁人函数。它有四个参数:-
accumulator
:累加器,它是上次运转callback
的效果。假如供应了initialValue
,那末第一次就是initialValue
; -
currentValue
:当前遍历的数组的元素; -
currentIndex
:当前遍历的数组的元素的index,从0最先。假如供应了initialValue
,那就从1最先; -
array
:当前运用reduce
的数组。
-
- 第二个是
initialValue
,是一个初值,作为第一次运转callback
函数的第一个实参。这个是可选的。这里要注重一下,假如这个参数不供应,而且运用在一个空数组上,是会报错的。
那末上面代码的意义就是,每次遍历数组举行比较,大的就留下来,即accumulator
,并将其用作下一次和数组元素的比较。末了只留下这一个值,即最大值。
假如求最小值,将a > b ? a : b;
改成 a < b ? a : b;
。
3. 运用Apply和Math.max()
代码以下:
function findMax3 (arr) {
let result = 0;
if (Array.isArray(arr) && arr.length > 0) {
result = Math.max.apply(null, arr);
return result;
} else {
throw new ReferenceError('The parameter arr is invalid');
}
}
诠释:
apply
诠释稍显庞杂,不作进一步的诠释。
它接收两个参数,第一个是thisArg
,第二个是argsArray
。两个都是可选的。此处简朴来讲,就是运用一个函数时,参数以数组的体式格局通报进去。
假如是求最小数,将Math.max()
改成Math.min()
。
4. 只用Math.max()
代码以下:
function findMax4 (arr) {
let result = 0;
if (Array.isArray(arr) && arr.length > 0) {
result = Math.max(...arr);
return result;
} else {
throw new ReferenceError('The parameter arr is invalid');
}
}
诠释:
基于上一个解法的思绪,在ES6中,有一个扩大运算符(…),能够将一个数组中的元素拆出来,构成一个用逗号分开的序列。恰好满足Math.max()
函数的需求。
如上一种算法,假如是求最小数,将Math.max()
改成Math.min()
。
运用Array.sort()排序
function findMax5 (arr) {
let result = 0;
if (Array.isArray(arr) && arr.length > 0) {
arr.sort((x, y) => y - x);
result = arr[0];
return result;
} else {
throw new ReferenceError('The parameter arr is invalid');
}
}
诠释:
经由过程Array.sort()要领将数组排序, 假如是求最大,就降序分列;假如是最小数,就升序分列。然后取第一个元素。
这里须要注重的是,Array.sort()假如不传任何参数,对整数的排序是有题目的,它只排第一位,也就是高位的递次,而不是全部整数的大小递次。比方[1, 34, 21, 4], 排序今后是[1, 21, 34, 4]。所以须要本身写个比较算法。上面的例子是降序分列的例子。假如是升序,将(x, y) => y - x
改成(x, y) => x - y
即可。