利用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初学者的编写开发的七个细节
Jan 11 Javascript
基于jQuery实现表单提交验证
Nov 24 Javascript
JS清除选择内容的方法
Jan 29 Javascript
jqueryUI里拖拽排序示例分析
Feb 26 Javascript
jquery实现简单的遮罩层
Jan 08 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
ionic实现底部分享功能
May 11 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
Jul 23 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
JS高级运动实例分析
2016/12/20 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
Mac 上切换Python多版本
2017/06/17 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Django模板Templates使用方法详解
2019/07/19 Python
python logging.info在终端没输出的解决
2020/05/12 Python
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
药学专业学生的自我评价分享
2014/02/06 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
python基础之//、/与%的区别详解
2022/06/10 Python
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js