fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[js] 第29天 写一个获取数组的最大值、最小值的方法

Open haizhilin2013 opened this issue 5 years ago • 28 comments

第29天 写一个获取数组的最大值、最小值的方法

haizhilin2013 avatar May 14 '19 20:05 haizhilin2013

Array.prototype.max = function(){
	return /^\d*$/g.test(a.join('')) ? Math.max(...a) : '请输入正确格式的数组';
};
var arrFirst = [1,'3',4];
var arrSecond = [1,'3','a'];
arrFirst.max();
arrSecond.max();

JamesSky avatar May 15 '19 03:05 JamesSky

Math.max.apply(Array,[25,62,91,78,34,62]) //  91
Math.min.apply(Array,[27,64,90,78,34,62]) // 27

git710 avatar May 15 '19 03:05 git710

    let arr = [10,20];
    let arr2 = arr.sort(function(a,b){
      return b-a;
    });
    document.write(arr2[0]);

yxkhaha avatar May 15 '19 05:05 yxkhaha

// 利用 reduce 冒泡排序
const getMax =  arr =>  arr.reduce((acc, val) => acc = acc < val ? val : acc)
getMax([25, 62, 91, 78, 34, 62]) // 91

tiu5 avatar May 15 '19 07:05 tiu5

Array.prototype.max = function() {
    return Math.max.apply(null, this)
}

es6

Math.max(...array)

tzjoke avatar May 28 '19 13:05 tzjoke

let arr = [1,2,3,4] 
Math.max(...arr)
Math.min(...arr)

myprelude avatar Jun 13 '19 07:06 myprelude

因为我是跳着做的,这题可以说是 Day54 的前置题目了。

const getMinAndMax = arr => ({
  // 数组展开在 ES5 中可以用 apply 代替
  // ES5: Math.min.apply(null, arr)
  min: Math.min(...arr),
  max: Math.max(...arr)
});

console.log(getMinAndMax([1, 2, 3, 4, 5, 6, 7, 8, 9]));
console.log(getMinAndMax([12, 223, 13, 4, 25, 36, 7, 18, 90]));

Konata9 avatar Jul 09 '19 14:07 Konata9

Array.prototype.max = function () { return /^\d*$/.test(this.join(''))?this.reduce((x1,x2)=>x1 = x1 < x2 ? x2 : x1):'请输入正确格式的数组'; }

wyx2014 avatar Jul 24 '19 07:07 wyx2014

const getMaxFromArr = arr => Math.max(...arr);
const getMinFromArr = arr => Math.min(...arr);

Vi-jay avatar Jul 29 '19 09:07 Vi-jay

Math.max(...array) Math.min(...array)

15190408121 avatar Sep 08 '19 12:09 15190408121

ES6之前用apply代替,作用域无所谓 Math.max.apply(null,[1,2,3]);

zhangkuibao avatar Sep 10 '19 03:09 zhangkuibao

// 利用 reduce 冒泡排序
const getMax =  arr =>  arr.reduce((acc, val) => acc = acc < val ? val : acc)
getMax([25, 62, 91, 78, 34, 62]) // 91

这不是冒泡排序吧?

gzwgq222 avatar Sep 10 '19 07:09 gzwgq222

  • ES5
Math.max.apply(null, array);
array.sort((a, b) => a - b);
const max = array[array.length - 1],
      min = array[0];

  • ES6
Math.max(...array);
Math.min(...array);
arr.reduce((prev, cur) => Math.max(prev, cur));
arr.reduce((prev, cur) => prev = prev > cur ? prev : cur);

gzwgq222 avatar Sep 10 '19 07:09 gzwgq222

封装了一个方法

function Arry(arr) {
	var arrys = {
		max: Math.max.apply(Array, arr),
		min: Math.min.apply(Array, arr)
	};
	return arrys;
}
console.log(Arry([25,62,91,78,34,62]));

15190408121 avatar Sep 21 '19 11:09 15190408121

var arr = [27, 64, 90, 78, 34, 62];
var newArr = arr.sort((a, b) => a - b);

var max = newArr[newArr.length - 1];
var min = newArr[0];


console.log(max);
console.log(min);

censek avatar Oct 29 '19 01:10 censek

function max() {
  return Math.max.apply(null, arguments);
}

function min() {
  return Math.min.apply(null, arguments);
}

0x3c avatar Mar 05 '20 09:03 0x3c

const getMaxAndMin = (arr=[]) => {
    arr.sort((a,b)=>a-b);
    return {
        max: arr[arr.length-1],
        min: arr[0]
    }
}

13168335674 avatar Jun 09 '20 08:06 13168335674

let arr = [1, 2, 3, 4, 5, 6]

Math.max.apply(null, arr) Math.min.apply(null, arr)

Math.max(...arr) Math.min(...arr)

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

let temp = arr.sort((a, b) => a - b) temp[temp - 1] temp[0]

blueRoach avatar Jun 28 '20 06:06 blueRoach

1. 排序法

首先我们对数组进行排序,可以按照升序排序,也可以按照降序排序。排序之后的数组中的第一个和最后一个元素就是我们需要的最大值或最小值。

排序可以使用sort()方法

// 方法一:排序法
arr.sort(function (a, b) {
    // 升序排序
    return a - b;
})

maxValue = arr[arr.length - 1];
minValue = arr[0];
console.log('最大值为:', maxValue); // 91
console.log('最小值为:', minValue); // 25

2. 假设法

可以假设数组中的第一个值是最大值,然后拿这个最大值和数组中的其他元素逐一比较,如果后面的某一个值比假设的值还大,说明假设错了,我们把假设的值进行替换,将这个值赋假设为新的最大值。循环结束后,拿到的结果就是我们想要的。最小值反之。

// 假设第一个数组元素就是数组中的最大值
maxValue = arr[0];
for (let i = 0; i < arr.length; i++) {
    let cur = arr[i];
    // 如果当前元素的值比假设的最大值大,就设置当前值为最大值,继续和后面元素比较
    maxValue = cur > maxValue ? cur : maxValue;
}
console.log('最大值为:', maxValue);

// 假设第一个数组元素就是数组中的最小值
minValue = arr[0];
for (let i = 0; i < arr.length; i++) {
    let cur = arr[i];
     // 如果当前元素的值比假设的最小值小,就设置当前值为最小值,继续和后面元素比较
    minValue = cur < minValue ? cur : minValue;
}
console.log('最小值为:', minValue);

3. 使用Math对象中的max/min方法

Math.max()函数返回一组数中的最大值,例如:

console.log(Math.max(1, 3, 2)); // 3

但是这个函数并不接受数组作为参数,且这个函数也不是数组对象中的方法,无法通过数组直接调用。这里我们可以使用apply来实现求数组中的最值,因为apply()方法接收的函数参数刚好是以数组方式进行传入的。

// 使用apply方法,可以直接将数组作用参数传入
maxValue = Math.max.apply(null, arr);
minValue = Math.min.apply(null, arr);

console.log('最大值为:', maxValue); // 91
console.log('最小值为:', minValue); // 25

一个小问题:

为什么通过apply就可以实现数组求最值了呢?

看一下applythis参数,上面代码中传递了一个null,也就是并没有将Math.max()方法绑定到其他对象上。这里只涉及到了两点:

  • Math.max()需要传入的是多个数值
  • apply()只需要把接收到的多个参数传递给Math.max(),只不过接收的多个参数是以数组形式接收的,刚好可以把数组传入,从而实现数组求最值。在apply()方法内部再将数组中的元素拆分成一个一个的参数值,传递给Math.max()即可。

4. 使用ES6的扩展运算符

扩展运算符可以展开数组,代替apply()将数组转化成函数参数的需求。

例如:

function sum(x, y, z) {
    return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers)); // 6

那么正好可以使用这个运算符将数组展开,展开成多个数值,然后作为多个参数向Math.max()传入。

console.log('最大值为:', Math.max(...arr)); // 91
console.log('最小值为:', Math.min(...arr)); // 25

参考文章

CoderLeiShuo avatar Aug 06 '20 11:08 CoderLeiShuo


const arr = [1,2,3,4,5,6,7,8]

//调用数学方法
function max(arr) {
    return Math.max.apply(null,arr);
}

function min(arr) {
    return Math.min.apply(null,arr);
}

// 循环对比
function max2(arr) {
    let res = -Infinity;
    for(i of arr) {
        if(res <= i) {
           res = i
        }
    }
    return res;
}

//排序然后取值 arr[0] arr[arr.length - 1]
arr.sort(function(a,b){
    return a-b;
})








laboonly avatar Aug 24 '20 15:08 laboonly

Math.max.apply(Array,[25,62,91,78,34,62]) // 91 Math.min.apply(Array,[27,64,90,78,34,62]) // 27

MrZ2019 avatar Sep 29 '20 07:09 MrZ2019

Math.max 和 Math.min 虽然能实现, 但是如果这道题目希望的是同时获取最大值和最小值,应该是没有捷径的,以数组的第一个元素作为参照值遍历一遍的时间复杂度是n,另外如果用排序实现,显然是不合理的。

maxthonl avatar Oct 28 '20 07:10 maxthonl

看了评论 自己居然没想到Math.max 但是昨天看题时发现一个数组的去重(考虑多维数组) 利用Array.prototype.flat() 所以我就想到了下面这个方法

function get(nums) {
  nums = nums.flat(Infinity).sort((a, b) => a - b)//[ 1, 1, 2, 2, 4, 5 ]
  return [nums[0], nums[nums.length - 1]]
}

console.log(get([1, 2, [5, 4, [2, 1]]]))//[ 1, 5 ]

Honjaychang avatar Nov 03 '20 14:11 Honjaychang

console.log(Math.max(...array)); console.log(Math.min(...array));

github-cxtan avatar Feb 23 '22 01:02 github-cxtan

// 获取数组最大值 最小值 let arr8 = [2,3,44,3,55,31,23] function mathMethod(arr) { console.log(Math.min.apply(null, arr)) console.log(Math.max.apply(null, arr)) return 最小值:${Math.min(...arr)} ---最大值: ${Math.max(...arr)} } console.log(mathMethod(arr8))

xiaoqiangz avatar May 30 '22 02:05 xiaoqiangz

let arr = [2, 4, 6, 8, 1, 23, 12, 2, 44, 6, 865, 4, 2, 5, 6, 7, 89, 87]
  let min, max
  for (let index = 0; index < arr.length; index++) {
    if (index === 0) {
      min = max = arr[index];
    } else {
      if (arr[index] > max) {
        max = arr[index];
      }
      if (arr[index] < min) {
        min = arr[index]
      }
    }
  }
  console.log(min,max);

wenxd avatar Jun 06 '22 11:06 wenxd

function getMaxMin(arr){
    let newArr = arr.sort((a, b) => {
         return a - b;
    })
    return {
        Max:  newArr[newArr.length - 1],
        Min: newArr[0];
    }
}

wyy-g avatar Sep 16 '22 13:09 wyy-g

您好!我看到邮件后会立即联系您!

CoderLeiShuo avatar Sep 16 '22 13:09 CoderLeiShuo

在JavaScript中,可以使用以下方法来获取数组的最大值和最小值:

1. 使用Math对象的max()和min()方法:
const array = [1, 5, 3, 2, 4];
   const max = Math.max(...array);
   const min = Math.min(...array);
   console.log(max); // 输出最大值
   console.log(min); // 输出最小值
2. 使用reduce()方法:
const array = [1, 5, 3, 2, 4];
   const max = array.reduce((a, b) => Math.max(a, b));
   const min = array.reduce((a, b) => Math.min(a, b));
   console.log(max); // 输出最大值
   console.log(min); // 输出最小值
3. 使用循环遍历数组:
const array = [1, 5, 3, 2, 4];
   let max = array[0];
   let min = array[0];
   for (let i = 1; i < array.length; i++) {
     if (array[i] > max) {
       max = array[i];
     }
     if (array[i] < min) {
       min = array[i];
     }
   }

console.log(max); // 输出最大值 console.log(min); // 输出最小值 以上三种方法都可以获取数组的最大值和最小值。根据具体的情况和需求,选择适合的方法来处理数组。

never123450 avatar Sep 05 '23 02:09 never123450

在JavaScript中,可以使用以下方法来获取数组的最大值和最小值:

1. 使用Math对象的max()和min()方法:
const array = [1, 5, 3, 2, 4];
   const max = Math.max(...array);
   const min = Math.min(...array);
   console.log(max); // 输出最大值
   console.log(min); // 输出最小值
2. 使用reduce()方法:
const array = [1, 5, 3, 2, 4];
   const max = array.reduce((a, b) => Math.max(a, b));
   const min = array.reduce((a, b) => Math.min(a, b));
   console.log(max); // 输出最大值
   console.log(min); // 输出最小值
3. 使用循环遍历数组:
const array = [1, 5, 3, 2, 4];
   let max = array[0];
   let min = array[0];
   for (let i = 1; i < array.length; i++) {
     if (array[i] > max) {
       max = array[i];
     }
     if (array[i] < min) {
       min = array[i];
     }
   }

   console.log(max); // 输出最大值
   console.log(min); // 输出最小值

以上三种方法都可以获取数组的最大值和最小值。根据具体的情况和需求,选择适合的方法来处理数组。

never123450 avatar Sep 05 '23 02:09 never123450