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


Posted in Javascript onNovember 05, 2018

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

总结

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

Javascript 相关文章推荐
Javascript调用XML制作连动下拉列表框
Jun 25 Javascript
JS request函数 用来获取url参数
May 17 Javascript
js数组的操作指南
Dec 28 Javascript
如何防止JavaScript自动插入分号
Nov 05 Javascript
js 动态生成html 触发事件传参字符转义的实例
Feb 14 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
May 27 Javascript
简单谈谈axios中的get,post方法
Jun 25 Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 Javascript
使用node.js对音视频文件加密的实例代码
Aug 30 Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 jQuery
微信小程序实现多张图片上传功能
Nov 18 Javascript
微信小程序实现底部导航
Nov 05 #Javascript
对 Vue-Router 进行单元测试的方法
Nov 05 #Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
Nov 05 #Javascript
微信小程序http连接访问解决方案的示例
Nov 05 #Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
Nov 05 #Javascript
浅谈Vue数据响应
Nov 05 #Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
Nov 05 #Javascript
You might like
php关闭warning问题的解决方法
2016/05/17 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python进程间通信用法实例
2015/06/04 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
如何进行Linux分区优化
2013/02/12 面试题
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
浪费资源的建议书
2014/03/12 职场文书
机械系毕业生求职信
2014/05/28 职场文书
临床医学专业求职信
2014/08/08 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
golang正则之命名分组方式
2021/04/25 Golang
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技