'use strict'; var uncurryThis = require('../internals/function-uncurry-this'); var aCallable = require('../internals/a-callable'); var isNullOrUndefined = require('../internals/is-null-or-undefined'); var lengthOfArrayLike = require('../internals/length-of-array-like'); var toObject = require('../internals/to-object'); var MapHelpers = require('../internals/map-helpers'); var iterate = require('../internals/map-iterate'); var Map = MapHelpers.Map; var mapHas = MapHelpers.has; var mapSet = MapHelpers.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 = []; var map = new Map(); var resolverFunction = !isNullOrUndefined(resolver) ? 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); } iterate(map, function (value) { push(result, value); }); return result; };