reduce方法高效实现对象数组去重

查阅资料我们可以知道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);

reduce方法高效实现对象数组去重_第1张图片
这里只需要注意initialValue得放一个空数组[],不然没法push,只要理解了reduce的处理过程,那么久很好理解它是怎么实现去重了,这里只根据名字去判断了,如果有其他的需求,仍然可以加判断以达到目的。

你可能感兴趣的:(js)