You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.2 KiB
36 lines
1.2 KiB
'use strict'; |
|
var getBuiltIn = require('../internals/get-built-in'); |
|
var uncurryThis = require('../internals/function-uncurry-this'); |
|
var aCallable = require('../internals/a-callable'); |
|
var lengthOfArrayLike = require('../internals/length-of-array-like'); |
|
var toObject = require('../internals/to-object'); |
|
var arraySpeciesCreate = require('../internals/array-species-create'); |
|
|
|
var Map = getBuiltIn('Map'); |
|
var MapPrototype = Map.prototype; |
|
var mapForEach = uncurryThis(MapPrototype.forEach); |
|
var mapHas = uncurryThis(MapPrototype.has); |
|
var mapSet = uncurryThis(MapPrototype.set); |
|
var push = uncurryThis([].push); |
|
|
|
// `Array.prototype.uniqueBy` method |
|
// https://github.com/tc39/proposal-array-unique |
|
module.exports = function uniqueBy(resolver) { |
|
var that = toObject(this); |
|
var length = lengthOfArrayLike(that); |
|
var result = arraySpeciesCreate(that, 0); |
|
var map = new Map(); |
|
var resolverFunction = resolver != null ? aCallable(resolver) : function (value) { |
|
return value; |
|
}; |
|
var index, item, key; |
|
for (index = 0; index < length; index++) { |
|
item = that[index]; |
|
key = resolverFunction(item); |
|
if (!mapHas(map, key)) mapSet(map, key, item); |
|
} |
|
mapForEach(map, function (value) { |
|
push(result, value); |
|
}); |
|
return result; |
|
};
|
|
|