遇到这样一个要求,求这个数组中对象的最大/最小值, 以下写两种方法来实现。
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,看看返回的结果一样吗