对象去重?伪命题吧,但是面试时还真有过,但是当时脑抽了,没能写出来,现在来补充一下,凑合能用
function isObj(obj){ // 宽松判断
return typeof obj === 'object'
}
function objToString(obj){
return JSON.stringify(sortKey(obj)) // JSON.stringify是对象转字符串的最佳方法,无论有几层嵌套
}
function sortKey(obj){ // 整理键值顺序
var keys = Object.keys(obj).sort();
var tempObj = {};
keys.forEach( key => {
tempObj[key] = isObj(obj[key]) ? sortKey(obj[key]) : obj[key];
})
return tempObj
}
var arr = [ // mock数据
{name:'123',detail:{lastName:'12',firstName:'3',age:{to:'18',from:'96'}}},
{detail:{lastName:'12',firstName:'3',age:{to:'18',from:'96'}},name:'123'}
]
function objSet(arr){
var result_set = [] // 缓存已经过键值顺序调整且经过toString处理的“对象”
var obj_set = [] // 存放真正的去重对象
arr.forEach(item=>{
var target = objToString(item); // 要将对象转成对字符串进行比较,关键
if(!result_set.includes(target)){
obj_set.push(item)
result_set.push(target)
}
})
return obj_set
}
objSet(arr)