将lodash _.uniqBy()转换为本机javascript

Gya*_*raw 4 javascript arrays distinct-values lodash

在这个片段中我被困在了_.uniqBy(array,iteratee),这个

  • iteratee 可以是函数或字符串同时
  • 在哪里放置条件来检查属性上的uniqness因为itratee函数可以是任何东西

var sourceArray = [ { id: 1, name: 'bob' },
  { id: 1, name: 'bill' },
  { id: 1, name: 'bill' } ,
  {id: 2,name: 'silly'},
  {id: 2,name: 'billy'}]

function uniqBy (inputArray, callback) {
  return inputArray.filter(callback)
}
var inputFunc = function (item) {
  return item.name
}

// var destArray = _.uniqBy(sourceArray,'name')

var destArray = uniqBy(sourceArray, inputFunc)
console.log('destArray', destArray)
Run Code Online (Sandbox Code Playgroud)

任何领导都将非常感激.

Ori*_*ori 13

uniqBy使用Map复杂度为O(n)的ES6 :

const uniqBy = (arr, predicate) => {
  const cb = typeof predicate === 'function' ? predicate : (o) => o[predicate];
  
  return [...arr.reduce((map, item) => {
    const key = (item === null || item === undefined) ? 
      item : cb(item);
    
    map.has(key) || map.set(key, item);
    
    return map;
  }, new Map()).values()];
};

const sourceArray = [ 
  { id: 1, name: 'bob' },
  { id: 1, name: 'bill' },
  null,
  { id: 1, name: 'bill' } ,
  { id: 2,name: 'silly'},
  { id: 2,name: 'billy'},
  null,
  undefined
];

console.log('id string: ', uniqBy(sourceArray, 'id'));

console.log('name func: ', uniqBy(sourceArray, (o) => o.name));
Run Code Online (Sandbox Code Playgroud)