js数组去重有经典的 几种方法
但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现。
因为:
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}
- ];