求数组中对象的最大最小值

546 阅读2分钟

遇到这样一个要求,求这个数组中对象的最大/最小值 以下写两种方法来实现。

reduce

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

语法

arr.reduce(callback(pre, next, index, arr))

pre: 累计器累计回调的返回值; 它是上一次调用回调时返回的累积值
next: 数组中正在处理的元素
index: 数组中正在处理的当前元素的索引
arr: 调用reduce()的数组

其实,它还有一个参数,是作为初始值的,(作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错)

假如下发的数组是这样的:

var arr = [
  {name:'李磊',age:12},
  {name:'王刚',age:7},
  {name:'赵宇',age:18},
  {name:'欧阳',age:19},
]

求谁的年龄最小?

var arr = [
  { name: '李磊', age: 12 },
  { name: '王刚', age: 7 },
  { name: '赵宇', age: 18 },
  { name: '欧阳', age: 19 },
]
var res = arr.reduce((pre, next) => {
  if (pre.age > next.age) {
    pre = next
  }
  return pre
})
console.log(res);  // { name: '王刚', age: 7 }

这样可以直接得出哪个对象的age是最小或者最大的。

sort

顾名思义:排序

sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。

语法

arr.sort([compareFunction])

参数

  • compareFunction 可选

    用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

    • firstEl

      第一个用于比较的元素。

    • secondEl

      第二个用于比较的元素。
      还是看例子来的快些:

var arr = [
  { name: '李磊', age: 12 },
  { name: '王刚', age: 7 },
  { name: '赵宇', age: 18 },
  { name: '欧阳', age: 19 },
]
var res = arr.sort((a,b)=>{
  return a.age - b.age
})
console.log(res);

输出一个新的数组:

[
  { name: '王刚', age: 7 },
  { name: '李磊', age: 12 },
  { name: '赵宇', age: 18 },
  { name: '欧阳', age: 19 }
]

注意:它会改变原数组的顺序

总结:

以上就是对这个需求的两种实现方法。

  • 平时用的reduce也比较少,它接收四个参数,并把上次的计算结果返回给pre,假如刚才我们在if语句中写return pre的话,将大错特错。(想一想是为什么)

  • sort是对数组进行排序,里面有两个参数,刚才我写的是a.age - b.age,有兴趣的同学可以试试b.age - a.age,看看返回的结果一样吗