利用hasOwnProperty给数组去重的面试题分享

 更新时间:2018年11月05日 16:20:41   作者:胡斐  
obj.hasOwnProperty(attr) 判断是否是原型中的属性,false就是原型中的属性,下面这篇文章主要给大家介绍了一道利用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);
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • JS实现数组扁平化的方法分享

    JS实现数组扁平化的方法分享

    数组扁平化指的是:将一个多层嵌套的数组,处理成只有一层的数组。本文主要和大家介绍了几个常用的JS数组扁平化方法,希望对大家有所帮助
    2023-04-04
  • 解析ES6中的解构赋值(数组,对象,嵌套,默认值)

    解析ES6中的解构赋值(数组,对象,嵌套,默认值)

    解构赋值是一种特殊的语法,它使我们可以将数组或对象“拆包”至一系列变量中,因为有时这样更方便,接下来通过本文给大家介绍ES6中的解构赋值(数组,对象,嵌套,默认值),需要的朋友可以参考下
    2022-11-11
  • JSON是什么?有哪些优点?JSON和XML的区别?

    JSON是什么?有哪些优点?JSON和XML的区别?

    这篇文章主要介绍了JSON是什么?有哪些优点?JSON和XML的区别?下面就来详细的介绍两种的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • iscroll动态加载数据完美解决方法

    iscroll动态加载数据完美解决方法

    这篇文章主要为大家详细介绍了iscroll动态加载数据的完美解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 微信小程序返回上一页刷新组件数据的示例代码

    微信小程序返回上一页刷新组件数据的示例代码

    这篇文章主要介绍了微信小程序返回上一页刷新组件数据的相关资料,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-03-03
  • 微信小程序实现五子棋游戏

    微信小程序实现五子棋游戏

    这篇文章主要为大家详细介绍了微信小程序实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • uniapp踩坑实战之文件查找失败:'uview-ui' at main.js解决办法

    uniapp踩坑实战之文件查找失败:'uview-ui' at main.js解决办法

    这篇文章主要给大家介绍了关于uniapp踩坑实战之文件查找失败:'uview-ui' at main.js的解决办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 封装属于自己的JS组件

    封装属于自己的JS组件

    这篇文章主要介绍了如何封装属于自己的JS组件,对js组件扩展以及封装用法的认识和总结,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 深入理解Promise.all

    深入理解Promise.all

    这篇文章主要介绍了深入理解Promise.all,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • es6 symbol的实现方法示例

    es6 symbol的实现方法示例

    这篇文章主要介绍了es6 symbol的实现方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论