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}
];
// 最简单数组去重法
/*
* 新建一新数组,遍历传入数组,值不在新数组就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));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,196评论 0 13
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,410评论 0 4
  • 你啊总是说自己不适合学习。可你想过自己适合做什么了吗?你总是幻想以后的自己要轰轰烈烈的创业,开辟一片自己的天地。可...
    苏陌染啊阅读 149评论 0 0
  • 二零一七年的十月一日,对龙口市人民来说,是一个有点特殊的日子。在这一天,位于徐福大街的龙口动植物园开业了。标志着龙...
    你若安好便是晴天qah阅读 4,182评论 0 7
  • 1 听妈妈说姥姥、姥爷家窑洞前的房子已经拆了,估计距离窑洞被拆也不会有太长时间了。所以一直有一个想法,就是想再回去...
    大话心情阅读 698评论 2 2