当数组包含对象,且对象的key顺序不一致时key的值确一致时,难点就出现了,需要单独对对象类型做处理,代码如下:
(如果数组中不包含对象,可以用其中的部分代码即可)
function unique(arr) {
// 因对象特别,分出数组中的对象单独去重
let objArr = arr.filter((item) => {
return Object.prototype.toString.call(item) === "[object Object]";
});
let otherTypeArr = arr.filter((item) => {
return Object.prototype.toString.call(item) !== "[object Object]";
});
// 数组及简单类型处理
let obj = {};
otherTypeArr = otherTypeArr.filter((item, index) => {
let newItem = item + JSON.stringify(item);
return obj.hasOwnProperty(newItem) ? false : (obj[newItem] = true);
});
// 对象类型处理
if (objArr.length !== 0) {
// 将数组对象转成数组字符串
var objToStrArr = [];
var keyArr = [];
var key = "";
var currentObj = {};
var currentStr = "";
objArr.forEach(item => {
// 对象属性排序
keyArr = [];
for (key in item) {
keyArr.push(key);
}
keyArr.sort(); // 降序
currentObj = {};
keyArr.forEach(ele => {
currentObj[ele] = item[ele];
})
currentStr = JSON.stringify(currentObj);
// 去除空格及\t空白字符
currentStr = currentStr.replace(/(\s|[\\t])/g, "");
objToStrArr.push(currentStr);
})
objToStrArr.sort();
var tmepArr = [];
// 数组去重
objToStrArr.forEach((item, i) => {
if (item !== tmepArr[tmepArr.length - 1]) {
tmepArr.push(item);
}
})
var resultArr = [];
// 新数组字符串转成数组对象
tmepArr.forEach((item) => {
resultArr.push(JSON.parse(item));
})
objArr = resultArr;
}
return [...otherTypeArr, ...objArr];
}
let arr = [
{ b: 100, a: 100 },
{ a: 100, b: 100 },
{ a: 100, b: 200 },
[1, 1, 2],
[1, 1, 2],
[2, 1, 1],
100,
200,
100,
];
console.log(unique(arr));
测试结果:
有bug欢迎提出