方法一 Set()
/**
* 使用 Set()
* Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
*
* 简述
* Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
*
* 另外,NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)。
*
*
* Array.form()
* 语法
* Array.from(arrayLike[, mapFn[, thisArg]])
* 参数
* arrayLike
* 想要转换成数组的伪数组对象或可迭代对象。
* mapFn 可选
* 如果指定了该参数,新数组中的每个元素会执行该回调函数。
* thisArg 可选
* 可选参数,执行回调函数 mapFn 时 this 对象。
* 返回值
* 一个新的数组实例。
*/
let res1 = Array.from(new Set(arr))
console.table(res1)
方法二 双层 for循环 + splice
/**
* 使用 双层for循环 + splice
*
* 每删除一个,j--保证j的值经过自加后不变。同时,len--,减少循环次数提升性能
*
*/
const func1 = (data) => {
let len = data.length
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (data[i] === data[j]) {
data.splice(j, 1)
len--
j--
}
}
}
return data
}
let res2 = func1(arr)
console.table(res2)
方法三 indexOf
/**
* 使用 indexOf
* 先建立建立一个空数组res, 在循环遍历数组,循环体内 用res.indexOf()查找当前索引的值是否存在 res数组内, indexOf 存在返回 下表索引, 不存在返回 -1,存在就跳过不做任何操作, 不存在则添加
*
*/
const func2 = (data) => {
const res = []
for (let i = 0; i < data.length; i++) {
if (res.indexOf(data[i]) === -1) res.push(data[i])
}
return res
}
const res3 = func2(arr)
console.table(res3)
方法四 使用 Array.prototype.includes()
/**
* 使用 Array.prototype.includes()
*
* arr.includes(valueToFind[, fromIndex])
* 参数
* valueToFind
* 需要查找的元素值。
*
* Note: 使用 includes()比较字符串和字符时是区分大小写的。
*
* fromIndex 可选
* 从fromIndex 索引处开始查找 valueToFind。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜 (即使从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0。
*
* 返回值
* 返回一个布尔值 Boolean 。
* ]如果在数组中(或 fromIndex 指定的范围中)找到了 valueToFind,则返回 true,否则返回 false。
*
*/
const func3 = (data) => {
const res = []
for (let i = 0; i < data.length; i++) {
if (!res.includes(data[i])) res.push(data[i])
}
return res
}
const res4 = func3(arr)
console.table(res4)
方法五 使用 Array.prototype.filter()
/**
* 使用 Array.prototype.filter()
* filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
*
* 语法
* var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
*
* 参数
* callback
* 用来测试数组的每个元素的函数。返回 true 表示该元素通过测试,保留该元素,false 则不保留。它接受以下三个参数:
* element
* 数组中当前正在处理的元素。
* index可选
* 正在处理的元素在数组中的索引。
* array可选
* 调用了 filter 的数组本身。
* thisArg可选
* 执行 callback 时,用于 this 的值。
* 返回值
* 一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。
*
*/
const func4 = (data) => {
return data.filter((item, index) => {
return arr.indexOf(item) === index
})
}
const res5 = func4(arr)
console.table(res5)
方法六 使用 Map()
/**
* 使用 Map()
* Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
*
* 详解 地址 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map
*
*/
const func5 = (data) => {
const res = []
const map = new Map()
for (let i = 0; i < data.length; i++) {
if (!map.has(data[i])) {
map.set(data[i], true)
res.push(data[i])
}
}
return res
}
const res6 = func5(arr)
console.table(res6)