查阅资料我们可以知道reduce方法的定义
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
从定义中看到这方法似乎是进行计算的,但其实除此之外,作为一个高级方法,它有很多骚操作
关于reduce
的一些常规使用方法参考这里
reduce语法
array.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
accumulator:(累计器,累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue)
currentValue:(当前处理的元素)
index:(当前处理元素的索引)
array:(调用reduce的源数组)
initialValue:(作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错)
好了,方法介绍结束,下面来个骚操作,需求:对象数组中去掉重复的对象。
对于一般数组来说常见的处理方式要么使用临时数组然后循环遍历,要么indexOf判断,高级一点使用ES6的新数据类型Set直接去重,但是对于对象数组本人亲自测试过,不好处理,还繁琐,下面直接上使用reduce方法的代码:
var resources = [
{ name: "张三", age: "18" },
{ name: "张三", age: "19" },
{ name: "张三", age: "20" },
{ name: "李四", age: "19" },
{ name: "王五", age: "20" },
{ name: "赵六", age: "21" }
]
var temp = {};
resources = resources.reduce((prev, curv) => {
// 如果临时对象中有这个名字,什么都不做
if (temp[curv.name]) {
}
// 如果临时对象没有就把这个名字加进去,同时把当前的这个对象加入到prev中
else {
temp[curv.name] = true;
prev.push(curv);
}
return prev
}, []);
console.log("结果", resources);
这里只需要注意initialValue
得放一个空数组[]
,不然没法push,只要理解了reduce的处理过程,那么久很好理解它是怎么实现去重了,这里只根据名字去判断了,如果有其他的需求,仍然可以加判断以达到目的。