zoukankan      html  css  js  c++  java
  • 数组对象去重 reduce()

     1 let log = console.log.bind(console);
     2 let person = [
     3      {id: 0, name: "小明"},
     4      {id: 1, name: "小张"},
     5      {id: 2, name: "小李"},
     6      {id: 3, name: "小孙"},
     7      {id: 1, name: "小周"},
     8      {id: 2, name: "小陈"},   
     9 ];
    10 
    11 let obj = {};
    12 
    13 person = person.reduce((cur,next) => {
    14     obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
    15     return cur;
    16 },[]) //设置cur默认类型为数组,并且初始值为空的数组
    17 log(person);

    打印person后,我们就可以得到去重后的数组。

    当然, redecu()除了累加和去重外,功能还有很多,比如可以扁平化多维数组——

    var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
        return a.concat(b);
    }, []); // [0,1,2,3,4,5]

    事实上,对于数组对象,传统的去重方法无能为力,至于forEach()、filter()等迭代方法也不好使;真正能做到优雅去重的,是ES5新增加的一个方法——reduce()

    reduce()方法接收一个回调函数作为第一个参数,回调函数又接受四个参数,分别是:

    1.previousValue => 初始值或上一次回调函数叠加的值;

    2. currentValue => 本次回调(循环)将要执行的值;

    3. index =>“currentValue”的索引值;

    4. arr => 数组本身;

     reduce()方法返回的是最后一次调用回调函数的返回值;

    再说句题外的,提到去重,很多人都会想到ES6的Set;不过根据我的实验,Set还是适合对基本类型的去重,如果Set中的每一项是对象的话,是不会去重的,j即使有的对象一模一样——

     
    let arr = new Set([
        {id: 0, name: "小明"},
        {id: 0, name: "小明"},
        {id: 0, name: "小明"},
        {id: 0, name: "小明"}      
    ]);
    console.log([...arr]); //依旧是这4个对象

  • 相关阅读:
    【css】容器撑满浏览器--- height:100%
    【实践】js六道有趣的题
    【Canvas】树冠
    asp.net上传Excel文件到服务端进行读取
    HttpContext.Current多线程调用
    abstract修饰符,具体类与抽象类的区别
    如何快速恢复MyEclipse的默认主题
    日历源代码
    for语句应用:乘法表
    Java的优先级
  • 原文地址:https://www.cnblogs.com/ajaxlu/p/11411913.html
Copyright © 2011-2022 走看看