利用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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 Javascript
Bootstrap表单布局样式代码
May 31 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
React Native中的RefreshContorl下拉刷新使用
Oct 09 Javascript
vue的diff算法知识点总结
Mar 29 Javascript
详解Angular路由之路由守卫
May 10 Javascript
微信小程序基于Taro的分享图片功能实践详解
Jul 12 Javascript
js前端如何写一个精确的倒计时代码
Oct 25 Javascript
es6数组includes()用法实例分析
Apr 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概述.
2006/10/09 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
jquery中:input和input的区别分析
2011/07/13 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
React如何避免重渲染
2018/04/10 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
python中return的返回和执行实例
2019/12/24 Python
python里反向传播算法详解
2020/11/22 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
银行实习生的自我评价
2014/01/13 职场文书
法学专业自我鉴定
2014/02/05 职场文书
2014年技术员工作总结
2014/11/18 职场文书
软件项目经理岗位职责
2015/04/01 职场文书