通用函数
以下支持普通数组与数组对象属性值去重
function unique(arr, prop) {
return arr.filter((v, index) => {
return prop
? arr.findIndex(fv => fv[prop] === v[prop]) === index
: arr.indexOf(v) === index
})
}
以下是几种去重的方式:
只保留取第一个值 (ES5 推荐) (适用于普通数组)
function unique(arr) {
return arr.filter(function(v, index) {
return arr.indexOf(v) === index
})
}
根据数组对象中的属性值去重(推荐)(适用于对数组对象属性值)
function unique(arr, prop) {
return arr.filter((v, index) => {
return arr.findIndex(fv => fv[prop] === v[prop]) === index
})
}
使用 ES6 的 Set 方法 (ES6 推荐) (适用于普通数组)
function unique(arr) {
// 或者 return [...new Set(arr)]
return Array.from(new Set(arr))
}
声明新数组,遍历新数组看是否存在值
function unique(arr) {
let res = [arr[0]]
for (let i = 0; i < arr.length; i++) {
let isExist = false
for (let j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
isExist = true
break
}
}
if (!isExist) {
res.push(arr[i])
}
}
return res
}
声明新数组,排序后,遍历看是否与新数组最后一个值相等
function unique(arr) {
let newArr = arr.sort((a, b) => a - b)
let res = [newArr[0]]
for (let i = 0; i < newArr.length; i++) {
if (newArr[i] !== res[res.length - 1]) {
res.push(newArr[i])
}
}
return res
}
声明新数组与新对象,判断对象属性是否存在
function unique(arr) {
let res = []
let obj = {}
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
obj[arr[i]] = true
res.push(arr[i])
}
}
return res
}
声明新数组, indexOf 或 lastIndexOf 判断值是否存在于新数组中
function unique(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}
声明新数组,includes 判断值是否存在于新数组中
function unique(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (!res.includes(arr[i])) {
res.push(arr[i])
}
}
return res
}
map 返回新数组,includes 过滤存在的
function unique(arr) {
let res = []
res = arr.map(item => {
return res.includes(item) ? false : item
})
return res
}
原文链接: github.com/liurongqing…