#89 数组去重


  • 0
    administrators

    编写一个函数 unique(arr),返回一个去除数组内重复的元素的数组。例如:

    unique([0, 1, 2, 2, 3, 3, 4]) // => [0, 1, 2, 3, 4]
    unique([0, 1, '1', '1', 2]) // => [0, 1, '1', 2]
    

  • -1

    const unique = (arr) => [...new Set(arr)]


  • 1


    const unique = (arr) => {
     var item = typeof arr[0] === 'undefined' ? [] : [arr[0]];
     for (var i=1; i<arr.length; i++) {
      item.indexOf(arr[i]) === -1 && item.push(arr[i])
     }

     return item;
    }

    不用新特性写法


  • 0

    不使用...运算符,可以如下实现

    const unique = (arr)  => Array.from(new Set(arr))
    

  • 0

    const unique = (arr) => {
    let a = ''
    for (var i = 0; i < arr.length; i ++) {
    a = arr.indexOf(arr[i], i + 1)
    if (a > -1) arr.splice(a, 1)
    }
    return arr
    }

    本地验证可以,但为什么不能通过呢


  • 0

    @wucancheng
    刚才看了一下,不用Array.form()直接用new Set()就能去重,请问Array.form()有什么其他的意义吗?


  • 0

    @湛瞳

    • 题目要求你返回的是一个去重后的数组,所以利用Set去重后,需要把Set转为Array

    • 那么怎么把Set转为Array

    • 使用简洁的扩展运算符...[...new Set()]返回

    • 使用Array.from方法转数组返回


  • 0

    @wucancheng 啊~~要求返回数组啊,谢谢啦


  • 1

    这还有一个骚方法,利用Map的key值唯一:

    const unique = (arr) => {
        const seen = new Map()
        return arr.filter((num) => !seen.has(num) && seen.set(num, 1))
    }
    

    使用对象也是一个道理:

    const unique = (arr) => {
        const tmparr = []
        const tmp = {}
        for (let i = 0, len = arr.length; i < len; i++) {
            if (!tmp.hasOwnProperty(arr[i])) {
                tmp[arr[i]] = 1
                tmparr.push(arr[i])
            }
        }
        return tmparr
    }
    

  • 0

    for(var i =0; i < arr.length; i++){
    for(var j = i+1; j <arr.length;j++){
    if(arr[i] === arr[j]){
    arr.splice(j,1);
    }
    }

    			}
    			return arr

  • 0

    const unique = (arr) => {
    if (Object.prototype.toString.call(arr) !== '[object Array]') return;
    let set = new Set(arr)
    return [...set]
    }


  • 0

    const unique = (arr) => /TODO/{
    return [...new Set(arr)] // set对象元素不可重复的特性哎去重复,再结构转为数组返回出来
    }


  • 0

    const unique = (arr) => {
       return arr.filter(function (element, index) {
           return arr.indexOf(element) === index;
       });
    };

  • 0

    const unique = (arr) => {
      let result = [];
    
      arr.forEach((e, idx, arr) => {
        if(idx === arr.indexOf(e)) {
          result.push(e)
        }
      })
      return result;
    }
    

    利用indexOf方法,如果元素的序号跟它在数组内第一次出现的序号相等,则把它push进result数组.


  • 0

    const unique = (arr) => [...new Set(arr)];

    利用扩展运算符,这道题很简单


  • 0

    const unique = (...res) => {
    // Array.from(new Set())
    let arr=[];
    res.forEach((ite)=>{
    arr=[].concat(ite);
    })
    return Array.from(new Set(arr))
    }
    //还有正则去,但是想不到


  • 0

    const unique = (arr) => {
      let a = []
      let s = new Set(arr)
      for (let item of s) {
        a.push(item)
      }
      return a
    }
    

  • 0

    就这么简单

    const unique = (arr) => Array.from(new Set(arr))
    

  • 0

    @湛瞳 转换为数组


  • 0

    ES5写法

    const unique = (arr) => {
      let obj = {},ret = [];
      for(let i = 0 ;i<arr.length;i++){
        let key = arr[i] + (typeof arr[i]);
        if(!obj[key]){
          obj[key] = true;
          ret.push(arr[i])
        }
      }
      return ret;
    } 
    

登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待