| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize modern exports="node" -o ./modern/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var baseRandom = require('../internals/baseRandom'), |
| isString = require('../objects/isString'), |
| shuffle = require('./shuffle'), |
| values = require('../objects/values'); |
| |
| /* Native method shortcuts for methods with the same name as other `lodash` methods */ |
| var nativeMax = Math.max, |
| nativeMin = Math.min; |
| |
| /** |
| * Retrieves a random element or `n` random elements from a collection. |
| * |
| * @static |
| * @memberOf _ |
| * @category Collections |
| * @param {Array|Object|string} collection The collection to sample. |
| * @param {number} [n] The number of elements to sample. |
| * @param- {Object} [guard] Allows working with functions like `_.map` |
| * without using their `index` arguments as `n`. |
| * @returns {Array} Returns the random sample(s) of `collection`. |
| * @example |
| * |
| * _.sample([1, 2, 3, 4]); |
| * // => 2 |
| * |
| * _.sample([1, 2, 3, 4], 2); |
| * // => [3, 1] |
| */ |
| function sample(collection, n, guard) { |
| if (collection && typeof collection.length != 'number') { |
| collection = values(collection); |
| } |
| if (n == null || guard) { |
| return collection ? collection[baseRandom(0, collection.length - 1)] : undefined; |
| } |
| var result = shuffle(collection); |
| result.length = nativeMin(nativeMax(0, n), result.length); |
| return result; |
| } |
| |
| module.exports = sample; |