/**
* 创建一个去重后的array数组副本,使用了全等比较,只有第一次出现的元素才会被保留
* Creates a duplicate-free version of an array, in which only the first occurrence of each element
* is kept. The order of result values is determined by the order they occur in the array
*
* @param {Array} array The array to inspect
* @returns {Array} Returns the new duplicate free array
* @example
* uniq([2, 1, 2, NaN, NaN])
* // => [2, 1, NaN]
*/
import arrayIncludes from "./arrayIncludes"
function baseUniq(array) {
var index = -1,
length = array.length,
result = []
outer: while (++index < length) {
var value = array[index]
//处理可能为NaN的情况
if (value === value) {
var resultIndex = result.length
while (resultIndex--) {
if (result[resultIndex] === value) {
continue outer
}
}
result.push(value)
} else if (!arrayIncludes(result, value)) {
result.push(value)
}
}
return result
}
function uniq(array) {
return array && array.length ? baseUniq(array) : []
}
// es6
// function uniq(array) {
// return array && array.length ? new Set(array) : []
// }
export default uniq
/**
* 判断数组中是否包含value元素
* @param {Array} [array] The array to inspect
* @param {*} target The value to search for
* @returns {boolean} Returns `true` if `target` is found, else `false`
*/
// indexOf方法
function strictIndexOf(array, value, fromIndex) {
var index = fromIndex - 1,
length = array.length
while (++index < length) {
if (array[index] === value) {
return index
}
}
return -1
}
// 匹配NaN的indexOf方法
function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length,
index = fromIndex + (fromRight ? 1 : -1)
while (fromRight ? index-- : ++index < length) {
if (predicate(array[index], index, array)) {
return index
}
}
return -1
}
// 判断是否是NaN元素
function baseIsNaN(value) {
return value !== value
}
function baseIndexOf(array, value, fromIndex) {
return value === value
? strictIndexOf(array, value, fromIndex)
: baseFindIndex(array, baseIsNaN, fromIndex)
}
function arrayIncludes(array, value) {
var length = array == null ? 0 : array.length
return !!length && baseIndexOf(array, value, 0) > -1
}
export default arrayIncludes