利用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 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
Javascript !!的作用
Dec 04 Javascript
jQuery 幻灯片插件(带缩略图功能)
Jan 24 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
jquery ajax 局部刷新小案例
Feb 08 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
微信小程序实现底部导航
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生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
详解js的六大数据类型
2016/12/27 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python处理cookie详解
2014/02/07 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Tesserocr库的正确安装方式
2018/10/19 Python
python事件驱动event实现详解
2018/11/21 Python
python输出数学符号实例
2020/05/11 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
深入了解NumPy 高级索引
2020/07/24 Python
银行会计财务工作个人的自我评价
2013/10/29 职场文书
资料员的岗位职责
2013/11/20 职场文书
车辆转让协议书
2014/04/15 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技