资讯专栏INFORMATION COLUMN

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

big_cat / 1809人阅读

摘要:是中用于检测对象是否包含某个属性的方法,返回一个布尔值。有一个用实现数组去重的方法但是,如果数组中包含引用类型的指,则此方法失效。

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);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99022.html

相关文章

  • 「前端面试系列8」数组去重(10 种浓缩版)

    摘要:后面的方法中的源数组,都是指的这个。它类似于数组,但是成员的值都是唯一的,没有重复的值。这貌似是目前看来最完美的解决方案了。所以稍加改变源数组,给两个空对象中加入键值对。 showImg(https://segmentfault.com/img/bVbpfjp?w=750&h=422); 前言 这是前端面试题系列的第 8 篇,你可能错过了前面的篇章,可以在这里找到: JavaScri...

    zollero 评论0 收藏0
  • 前端空间 - 收藏集 - 掘金

    摘要:封装手写的方笔记使用检测文件前端掘金副标题可以做什么以及使用中会遇到的坑。目的是帮助人们用纯中文指南实现复选框中多选功能前端掘金作者缉熙简介是推出的一个天挑战。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金译者注:本文作者是著名 JavaScript BDD 测试框架 Chai.js 源码贡献者之一,Chai.js 中会遇到很多异常处理...

    you_De 评论0 收藏0
  • 前端空间 - 收藏集 - 掘金

    摘要:封装手写的方笔记使用检测文件前端掘金副标题可以做什么以及使用中会遇到的坑。目的是帮助人们用纯中文指南实现复选框中多选功能前端掘金作者缉熙简介是推出的一个天挑战。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金译者注:本文作者是著名 JavaScript BDD 测试框架 Chai.js 源码贡献者之一,Chai.js 中会遇到很多异常处理...

    lwx12525 评论0 收藏0
  • JS数组去重总结

    摘要:数组去重,一般会在面试的时候才会碰到,要求手写数组去重方法的代码。在实际项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。数组去重的方法一利用去重中最常用如果不考虑兼容性,这种去重的方法代码最少。 数组去重,一般会在面试的时候才会碰到,要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。 在实际项目中碰到的...

    whinc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<