利用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 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
js window.onload 加载多个函数的方法
Nov 02 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
Dec 16 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
May 29 Javascript
javascript中正则表达式语法详解
Aug 07 Javascript
vscode中使用npm安装babel的方法
Aug 02 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
最省空间的计数器
2006/10/09 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
python爬虫实例详解
2018/06/19 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
村级环境卫生整治方案
2014/05/04 职场文书
语文课外活动总结
2014/08/27 职场文书
中学生检讨书范文
2014/11/03 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
大一学生个人总结
2015/02/15 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python