array-unique-by.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. 'use strict';
  2. var aCallable = require('../internals/a-callable');
  3. var isNullOrUndefined = require('../internals/is-null-or-undefined');
  4. var lengthOfArrayLike = require('../internals/length-of-array-like');
  5. var toObject = require('../internals/to-object');
  6. var createProperty = require('../internals/create-property');
  7. var MapHelpers = require('../internals/map-helpers');
  8. var iterate = require('../internals/map-iterate');
  9. var Map = MapHelpers.Map;
  10. var mapHas = MapHelpers.has;
  11. var mapSet = MapHelpers.set;
  12. // `Array.prototype.uniqueBy` method
  13. // https://github.com/tc39/proposal-array-unique
  14. module.exports = function uniqueBy(resolver) {
  15. var that = toObject(this);
  16. var length = lengthOfArrayLike(that);
  17. var result = [];
  18. var map = new Map();
  19. var resolverFunction = !isNullOrUndefined(resolver) ? aCallable(resolver) : function (value) {
  20. return value;
  21. };
  22. var index, item, key;
  23. for (index = 0; index < length; index++) {
  24. item = that[index];
  25. key = resolverFunction(item);
  26. if (!mapHas(map, key)) mapSet(map, key, item);
  27. }
  28. index = 0;
  29. iterate(map, function (value) {
  30. createProperty(result, index++, value);
  31. });
  32. return result;
  33. };