当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现。
因为:
1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致所有元素都相等,这时判断方法不再有意义。一般最后数组就只剩一个
2.如果是直接比较法,则因为对象在内存中是按引用访问的,属性值相同的对象也不会相等,简单的直接判断不再有意义。一般最后数组还是原样
所以就需要进行值的比较
当然了,也可以换着法来将相应对象转为字符串(不是默认的那种[object Object])
举个例子:
var array = [
{a:1,b:2,c:3,d:4},
{a:11,b:22,c:333,d:44},
{a:111,b:222,c:333,d:444},
{a:11,b:22,c:33,d:44},
{a:11,b:22,c:33,d:444}
];
方法为
//将对象元素转换成字符串以作比较
function obj2key(obj, keys){
var n = keys.length,
key = [];
while(n--){
key.push(obj[keys[n]]);
}
return key.join('|');
}
//去重操作
function uniqeByKeys(array,keys){
var arr = [];
var hash = {};
for (var i = 0, j = array.length; i < j; i++) {
var k = obj2key(array[i], keys);
if (!(k in hash)) {
hash[k] = true;
arr .push(array[i]);
}
}
return arr ;
}
//进行去重
var arr = uniqeByKeys(array,['a','b']);
假如需要按照属性a,b为数组进行去重
那么最后将得到
array = [
{a:1,b:2,c:3,d:4},
{a:11,b:22,c:333,d:44},
{a:111,b:222,c:333,d:444}
];
// 最简单数组去重法
/*
* 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中
* IE8以下不支持数组的indexOf方法
* */
function uniq(array){
var temp = []; //一个新的临时数组
for(var i = 0; i < array.length; i++){
if(temp.indexOf(array[i]) == -1){
temp.push(array[i]);
}
}
return temp;
}
var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(uniq(aa));
网友评论