当数组中包含对象时,普通的去重方法无法将两个相同的对象识别出来,从而达不到去重的效果
const arr = [
{ a: 1, b: 2 },
{ a: 4, b: 5 },
{ a: 1, b: 2 },
{ a: 6, b: 7 },
{ a: 1, b: 2 },
]
复制代码
在这个数组中,数组元素都是对象,且第1、第3、第5项相同,如果用 indexOf
的方法去重,会得到如下结果
function unique(arr){
let b = []
for(let i = 0; i < arr.length; i++){
if(b.indexOf(arr[i]) === -1){
b.push(arr[i])
}
}
return b
}
b // b 与 arr 相同,未达到去重效果
复制代码
使用 Set
去重
const b = Array.from(new Set(arr))
b // b 与 arr 相同,未达到去重效果
复制代码
以上两种方法均未实现去重效果
那么该如何实现?
其实改良一下之前的方法就可以达到去重效果
- 将数组元素转化为字符串,并设置为空对象的属性名,然后赋值以实现去重
function unique(arr) {
let b = []
let hash = {}
for (let i = 0; i < arr.length; i++) {
if (!hash[JSON.stringify(arr[i])]) {
hash[JSON.stringify(arr[i])] = true
b.push(arr[i])
}
}
return b
}
const b = unique(arr)
console.log(b)
// 成功实现去重
[
{ a: 1, b: 2 },
{ a: 4, b: 5 },
{ a: 6, b: 7 },
]
复制代码
- 通过将数组的每一项转换为字符串,两次循环进行对比去重
function unique1(arr) {
let b = []
for (let i = 0; i < arr.length; i++) {
let unexit = true
for (let j = i + 1; j < arr.length; j++) {
if (JSON.stringify(arr[i]) === JSON.stringify(arr[j])) {
unexit = false
break
}
else {
unexit = true
}
}
if (unexit) {
b.push(arr[i])
}
}
return b
}
const b = unique(arr)
console.log(b)
// 成功实现去重
[
{ a: 1, b: 2 },
{ a: 4, b: 5 },
{ a: 6, b: 7 },
]
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END