首页 > 试题广场 >

设计一个uniqueify函数,可以根据用户自定义的 重复判

[问答题]
设计一个uniqueify函数,可以根据用户自定义的 重复判定规则 进行数组元素去重,举个例子:
//情况一:
letarr0 = [1,1,1,0,5,6];
uniqueify(arr0);
//输出:[1,0,5,6]

//情况二:
letarr1 = [
    {id: 1, name:'xx'},
    {id: 1, name:'xx'},
    {id: 2, name:'xx'},
    {id: 1, name:'xx'},
    {id: 1, name:'xx'}
];
uniqueify(arr1, a=>a.id);//假如这里的去重规则依据为id
//输出:
[
    {id: 1, name:'xx'},
    {id: 2, name:'xx'}
];

//情况三:
letarr2 = [
    {name:'xx',sex:'male'},
    {name:'xx',sex:'female'},
    {name:'xx',sex:'male'},
    {name:'aa',sex:'male'},
    {name:'aa',sex:'male'}
];
uniqueify(arr2, a=>(a.name+a.sex));//假如这里的去重规则依据为名字和性别均相同,才算是相同
//输出:
[
    {name:'xx',sex:'male'},
    {name:'xx',sex:'female'},
    {name:'aa',sex:'male'}
];
function uniqueify(data=[],callback = e=>e){
   let resArr = data.reduce((result,cur)=>{
    let value = callback(cur)
    if(!result.get(value)){
        result.set(value,cur)
    }
    return result
  },new Map())
  return Array.from(resArr.values())
}

编辑于 2020-08-07 22:33:27 回复(0)
function uniqueify (arr, fn=item => item) {
  if(!Array.isArray(arr) || 
    typeof fn != "function") return;
  let obj = {};
  for(let i=0; i<arr.length; ++i) {
    let key = fn(arr[i]);
    if(!(key in obj)) {
      obj[key] = arr[i];
    }
  }
  return Object.values(obj);
}

发表于 2020-06-03 13:45:57 回复(0)
function uniqueify(arr, cb) {
  let newArr = [];
  if (!cb) {
    //cb 不存在, 直接数组去重
    newArr = [...new Set(arr)];
  } else {
    // cb存在
    let obj = {};
    arr.forEach(item => {
      if (!obj[cb(item)]) {
        obj[cb(item)] = item;
        newArr.push(item);
      }
    });
  }

  console.log(newArr);
}

发表于 2020-01-03 19:02:16 回复(1)
 function uniqueify(arr) {
        var ret = [];
        var len = arr.length;
        var tmp = {};
        var tmpKey;
        for (var i = 0i < leni++) {
            tmpKey = typeof arr[i+ JSON.stringify(arr[i]);
            if (!tmp[tmpKey]) {
                tmp[tmpKey= 1;
                ret.push(arr[i]);
            }
        }
        return ret;
    }
发表于 2020-10-26 17:22:41 回复(0)
1h头像 1h
function uniqueify(arr, fn) {
    const cb = fn || function(item){return item}
    let newArr = []
    let obj = {};
    for(let i = 0; i < arr.length; i++) {
        if(!obj[cb.call(null, arr[i])]) {
            obj[cb.call(null, arr[i])] = 1
            newArr.push(arr[i])
        }
    }
    console.log(newArr)
    return newArr;
}

发表于 2020-05-24 10:47:07 回复(0)
const indexOf = Array.prototype.indexOf
    Array.prototype.indexOf = function (item, fun) {
        if (fun) {
            let result = -1
            this.forEach((i) => {
                fun(i) === fun(item) && (result = i)
            })
            return result
        } else {
            return indexOf.call(this, item)
        }
    }
    function uniqueify(arr, fun) {
        const result = []
        arr.forEach(item => {
            result.indexOf(item, fun) === -1 && result.push(item)
        })
        console.log(result)
        return result
    }
发表于 2020-04-24 10:11:38 回复(0)
  function uniqueify(arr) {
            var Obj = {};
            var newArr = [];
            for (var i = 0i < arr.lengthi++) {
                if (typeof (arr[i]) == "object") {
                    if (!Obj.hasOwnProperty(JSON.stringify(arr[i]))) {
                        Obj[JSON.stringify(arr[i])] = 1;
                        newArr.push(arr[i])
                    }
                } else {
                    if (!Obj.hasOwnProperty(arr[i])) {
                        Obj[arr[i]] = 0;
                        newArr.push(arr[i])
                    }
                }

            }
            return newArr;
        }
发表于 2020-01-06 20:51:56 回复(1)