javascript - 将 lodash _.uniqBy() 转换为原生 javascript

标签 javascript arrays lodash distinct-values

在这段代码中,我被困在了 _.uniqBy(array,iteratee),this

  • iteratee 可以是函数,也可以是字符串
  • 在哪里放置条件以检查属性的唯一性,因为 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)

我们将不胜感激任何线索。

最佳答案

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

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));

关于javascript - 将 lodash _.uniqBy() 转换为原生 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40801349/

相关文章:

javascript - 有没有办法用 Chutzpah 运行一个测试?

arrays - 如何索引数组中的字符串?

javascript - 无法在 HTML 元素上实现 onclick 事件

javascript - 如何使用 lodash _groupBy

javascript - 如何将具有相同键的一组对象组合成一个对象?

javascript - 如何从分层数据生成 Kendo Treeview ? AngularJS

javascript - 如何使用 Javascript 添加两个范围 slider 并在文本框中打印值?

javascript - 我的 AngularJS 应用程序中的过滤结果不准确

arrays - 如何将数组类型组参数映射到 LTI1p0

javascript - Lodash 从数组中删除重复项