sampleSize.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. var baseClamp = require('./_baseClamp'),
  2. baseRandom = require('./_baseRandom'),
  3. isIterateeCall = require('./_isIterateeCall'),
  4. toArray = require('./toArray'),
  5. toInteger = require('./toInteger');
  6. /**
  7. * Gets `n` random elements at unique keys from `collection` up to the
  8. * size of `collection`.
  9. *
  10. * @static
  11. * @memberOf _
  12. * @since 4.0.0
  13. * @category Collection
  14. * @param {Array|Object} collection The collection to sample.
  15. * @param {number} [n=1] The number of elements to sample.
  16. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  17. * @returns {Array} Returns the random elements.
  18. * @example
  19. *
  20. * _.sampleSize([1, 2, 3], 2);
  21. * // => [3, 1]
  22. *
  23. * _.sampleSize([1, 2, 3], 4);
  24. * // => [2, 3, 1]
  25. */
  26. function sampleSize(collection, n, guard) {
  27. var index = -1,
  28. result = toArray(collection),
  29. length = result.length,
  30. lastIndex = length - 1;
  31. if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
  32. n = 1;
  33. } else {
  34. n = baseClamp(toInteger(n), 0, length);
  35. }
  36. while (++index < n) {
  37. var rand = baseRandom(index, lastIndex),
  38. value = result[rand];
  39. result[rand] = result[index];
  40. result[index] = value;
  41. }
  42. result.length = n;
  43. return result;
  44. }
  45. module.exports = sampleSize;