一道用hasOwnProperty给数组去重的面试题

hasOwnProperty

hasOwnProperty是javascript中用于检测对象是否包含某个属性的方法,返回一个布尔值。

var o = { a: 1};
console.log(o.hasOwnProperty('a')); // true
console.log(o.hasOwnProperty('b')); // false

有一个用hasOwnProperty实现数组去重的方法:

var arr = ['a', 'b', 'c', 'b'];

function uniqueArr(arr){

    var unique = [], temp = {};

    for(var i = 0; i < arr.length; i++){
        if(temp[arr[i]] === undefined){
            temp[arr[i]] = 1;
            unique.push(arr[i]);
        }
    }

    return unique;
}

但是,如果数组中包含引用类型的指,则此方法失效。 那么该如何判断两个对象是否相等呢?

我们假设,如果两个对象具有相同的keys,并且每个key对应的value也都相等,则这两个对象相等。

现在我们已经明确了判断规则,那么该如何实现呢?

var o1 = {a:1, b:2},
    o2 = {b:2, a:1},
    o3 = {a:2, b:1};

function isEqual(o1, o2){

    var o1_keys = Object.keys(o1);
    var o2_keys = Object.keys(o1);

    if(o1_keys.length !== o2_keys.length){
        return false;
    }

    o1_keys = o1_keys.sort();
    o2_keys = o2_keys.sort();
    if(o1_keys.join('||') !== o2_keys.join('||')){
        return false;
    }

    var r = true;
    for(var key of o1_keys){
        
        if( !isPrimitive(o1[key] ) && !isPrimitive( o2[key])){
            if(!isEqual(o1[key], o2[key])){
            r = false;
            break;
            }
        } else if(o1[key] !== o2[key]){
            r = false;
            break;
        } 
    }

    return r;


    function isPrimitive(v){
        var type = typeof v;
        return type === 'number' || type === 'string' || type === 'boolean' || v === undefined || v === null;   
    }


}

console.log(isEqual(o1, o2));
console.log(isEqual(o1, o3));
console.log(isEqual({a:1, b:{c:1}}, {b:{c:2}, a:1}));
console.log(isEqual({a:1, b:{c:1}}, {b:{c:1}, a:1}));
console.log(isEqual({a:1, b:{c:1},c:2}, {b:{c:1}, a:1}));
console.log(isEqual({a:1, b:{c:1}}, {b:{c:1}, a:{b:1}}));
console.log(isEqual({a:1, b:function(){}}, {b:function(){}, a:1}));

上面的代码,我们基本上实现了判断两个对象是否相等,but!!!,还有一点,就是如果对象是函数,怎么判断是否相等?简单一点:Object.toString。

var f1 = function(){};
var f2 = function(){};

if(f1.toString() === f2.toString()){
    console.log(true);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值