首先定义一个数组用来去重:
var arr = ['a', 'a',1,1,'1','1',true,true,'true','true',undefined,undefined, 'undefined','undefined',null,null,'null','null', NaN, NaN,'NaN','NaN', {},{}, '{}','{}'];
console.log(arr)
1、下面的方法是在网上搜索根据对象暂存去重:
function unique(arr){
var unique = [];
var temp = {};
for(var i=0;i<arr.length;i++){
if(!temp.hasOwnProperty(arr[i])){
temp[arr[i]] = arr[i];
unique.push(temp[arr[i]]);
}
}
return unique;
}
打印的结果:
["a", 1, true, undefined, null, NaN, {…}, "{}"]
对1与“1”不能进行区分
2、下面的方法也是在网上搜索找下的方法
function array_unique(arr) {
return arr.filter(function(e,i){
return arr.indexOf(e)===i;
})
}
打印结果:
["a", 1, "1", true, "true", undefined, "undefined", null, "null", "NaN", {…}, {…}, "{}"]
对NaN与{}对象不能进行区分
3、下面是自己整理的方法
//判断数据类型
function type(data){
var type = typeof(data);
if(type == 'object'){
var obj = Object.prototype.toString;
type = obj.call(data)
}
return type;
}
这使用上面的类型判断来拼接这个暂存对象的键,避免数字与字符混合存在时键混乱;
下面这个方法结合type方法进行去重:
//数组去重,利用对象使用hasOwnProperty
Array.prototype.unique = function(){
var unique = [];
var temp = {};
for(var i=0;i<this.length;i++){
var str = type(this[i]) + this[i];//利用type方法返回值拼接作为对象键
if(!temp.hasOwnProperty(str)){
temp[str] = this[i];
unique.push(temp[str]);
}
}
return unique;
}
["a", 1, "1", true, "true", undefined, "undefined", null, "null", NaN, "NaN", {…}, "{}"]
根据上面数据看是已去重,可能中间有测试不到的地方
返回的结果:arr.unique()调用