2016-11-25 4 views
2

Вот в этом фрагменте я застрял, как в _.uniqBy(array,iteratee), этоПреобразование lodash _.uniqBy() в родную JavaScript

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

Любые указания на это будут оценены по достоинству.

+0

[Проверить код lodash.uniqBy()] (https://github.com/lodash/lodash/blob/master/lodash.js#L4253) – GillesC

+0

Да, посмотрите, поможет ли исходный код: https : //github.com/lodash/lodash/blob/4.17.2/lodash.js#L8419 – Fernando

ответ

0

Вы могли бы использовать свой род упорядоченного по имени и фильтр, основанный на сравнении окрестностей, как это:

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

 
var uniqBy = (inputArray, callback) => inputArray.sort((a,b) => callback(a) > callback(b)) 
 
.filter((x,i,arr) => i === arr.length -1 ? true : callback(x) !== callback(arr[i+1])); 
 
var inputFunc = item => item.name; 
 

 

 
var destArray = uniqBy(sourceArray, inputFunc) 
 
console.log('destArray', destArray)

2

An ES6 uniqBy использования Map с сложностью O (N):

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

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

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

 
console.log('name func: ', uniqBy(sourceArray, (o) => o.name));