JS 数组去重,包含嵌套对象
2020-10-14 本文已影响0人
格致匠心
女票面字节遇到的题目,复盘的时候帮忙做了一下,复杂度有点大,还借助了api,感觉自己现在算法退步好多。
题目
实现数组去重,数组元素包含嵌套的对。难点:对象是无序的。
输入
const arr = [{a:1}, 1,1,2,3,4,4, {a:1}, {a:1,b:2}, {b:2,a:1}, {a: {b:2,a:1}, b:3}, {b:3, a: {b:2,a:1}}]
代码
// 核心:dfs+JSON.stringfy+key排序
const keySortedObjectStringify = (obj) => {
const newObj = {};
Object.keys(obj).sort().forEach(key => {
const item = obj[key];
let stringifyItem = item;
if(typeof item === 'object') {
if(Array.isArray(item)) {
stringifyItem = JSON.stringify(item);
} else {
stringifyItem = keySortedObjectStringify(item);
}
}
newObj[key] = stringifyItem;
})
return JSON.stringify(newObj);
}
const removeDuplication = (arr) => {
const res = [];
const map = {};
for(const item of arr) {
let stringifyItem = item;
if(typeof item === 'object') {
if(Array.isArray(item)) {
stringifyItem = JSON.stringify(item);
} else {
stringifyItem = keySortedObjectStringify(item);
}
}
if(!map[stringifyItem]) {
map[stringifyItem] = true;
res.push(item);
}
}
return res;
}
其实代码有个边界条件没考虑好,就是数组可能嵌套复杂元素,不过能过测试样例就行辣。