You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
9 years ago
|
var baseCallback = require('../internal/baseCallback'),
|
||
|
baseUniq = require('../internal/baseUniq'),
|
||
|
isIterateeCall = require('../internal/isIterateeCall'),
|
||
|
sortedUniq = require('../internal/sortedUniq');
|
||
|
|
||
|
/**
|
||
|
* Creates a duplicate-free version of an array, using
|
||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
|
* for equality comparisons, in which only the first occurence of each element
|
||
|
* is kept. Providing `true` for `isSorted` performs a faster search algorithm
|
||
|
* for sorted arrays. If an iteratee function is provided it's invoked for
|
||
|
* each element in the array to generate the criterion by which uniqueness
|
||
|
* is computed. The `iteratee` is bound to `thisArg` and invoked with three
|
||
|
* arguments: (value, index, array).
|
||
|
*
|
||
|
* If a property name is provided for `iteratee` the created `_.property`
|
||
|
* style callback returns the property value of the given element.
|
||
|
*
|
||
|
* If a value is also provided for `thisArg` the created `_.matchesProperty`
|
||
|
* style callback returns `true` for elements that have a matching property
|
||
|
* value, else `false`.
|
||
|
*
|
||
|
* If an object is provided for `iteratee` the created `_.matches` style
|
||
|
* callback returns `true` for elements that have the properties of the given
|
||
|
* object, else `false`.
|
||
|
*
|
||
|
* @static
|
||
|
* @memberOf _
|
||
|
* @alias unique
|
||
|
* @category Array
|
||
|
* @param {Array} array The array to inspect.
|
||
|
* @param {boolean} [isSorted] Specify the array is sorted.
|
||
|
* @param {Function|Object|string} [iteratee] The function invoked per iteration.
|
||
|
* @param {*} [thisArg] The `this` binding of `iteratee`.
|
||
|
* @returns {Array} Returns the new duplicate-value-free array.
|
||
|
* @example
|
||
|
*
|
||
|
* _.uniq([2, 1, 2]);
|
||
|
* // => [2, 1]
|
||
|
*
|
||
|
* // using `isSorted`
|
||
|
* _.uniq([1, 1, 2], true);
|
||
|
* // => [1, 2]
|
||
|
*
|
||
|
* // using an iteratee function
|
||
|
* _.uniq([1, 2.5, 1.5, 2], function(n) {
|
||
|
* return this.floor(n);
|
||
|
* }, Math);
|
||
|
* // => [1, 2.5]
|
||
|
*
|
||
|
* // using the `_.property` callback shorthand
|
||
|
* _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
|
||
|
* // => [{ 'x': 1 }, { 'x': 2 }]
|
||
|
*/
|
||
|
function uniq(array, isSorted, iteratee, thisArg) {
|
||
|
var length = array ? array.length : 0;
|
||
|
if (!length) {
|
||
|
return [];
|
||
|
}
|
||
|
if (isSorted != null && typeof isSorted != 'boolean') {
|
||
|
thisArg = iteratee;
|
||
|
iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;
|
||
|
isSorted = false;
|
||
|
}
|
||
|
iteratee = iteratee == null ? iteratee : baseCallback(iteratee, thisArg, 3);
|
||
|
return (isSorted)
|
||
|
? sortedUniq(array, iteratee)
|
||
|
: baseUniq(array, iteratee);
|
||
|
}
|
||
|
|
||
|
module.exports = uniq;
|