难点:对象是无序的
关键:利用对象属性
核心:对象根据key排序后通过JSON.stringify转换,构造唯一的对象属性
输入:
unique([0,0,'','',{},{},null,null,undefined,undefined,false,false,true,true,NaN,NaN,{a:1}, 1,1,'1',2,3,4,4, {a:1}, {a:1,b:2}, {b:2,a:1}, {a: {y:2,x:1}, b:3}, {b:3, a: {x:1,y:2}}])
代码:
function unique(arr) {
var obj = {};
for(var i=0; i<arr.length; i++) {
var item = arr[i];
var t = typeof(item);
switch(t){
case 'object':
var o = sortObjKey(item);//排序后的对象
obj[JSON.stringify(o)] = item;
break;
case 'number'://区分不同类型的值,例如:1和'1'
obj['n_' + item] = item;
break;
case 'string'://区分不同类型的值,例如:1和'1'
obj['s_' + item] = item;
break;
default:
obj[item] = item;
break;
}
}
var newArr = [];
for(var attr in obj) {
newArr.push(obj[attr]);
}
return newArr;
}
// 对象根据Key排序
function sortObjKey(obj) {
if(obj === null) return obj;
var keys = Object.keys(obj).sort();
var o = {};
for(var i = 0; i < keys.length; i++) {
var k = keys[i];
var v = obj[k];
if(typeof(v) === 'object') {
o[k] = sortObjKey(v); // 递归
} else {
o[k] = v;
}
}
return o;
}
输出: