利用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 Event学习第四章 传统的事件注册模型
Feb 07 Javascript
非常好用的JsonToString 方法 简单实例
Jul 18 Javascript
js替代copy(示例代码)
Nov 27 Javascript
jquery中EasyUI使用技巧小结
Feb 10 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
Jan 10 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
Jun 06 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
Mar 09 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 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
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
文本框回车提交与禁止提交示例
2013/09/27 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
python实现电脑自动关机
2018/06/20 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
Opencv求取连通区域重心实例
2020/06/04 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
《胡杨》教学反思
2014/02/16 职场文书
2014年会策划方案
2014/05/11 职场文书
母亲节演讲稿
2014/05/27 职场文书
写给医院的感谢信
2015/01/22 职场文书
2016新年感言
2015/08/03 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
《折线统计图》教学反思
2016/02/22 职场文书