利用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 学习笔记(十三)Dom创建表格
Jan 21 Javascript
JS读取cookies信息(记录用户名)
Jan 10 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
关于javascript中dataset的问题小结
Nov 16 Javascript
Vue组件化开发思考
Feb 02 Javascript
JavaScript判断日期时间差的实例代码
Mar 01 Javascript
vue之将echart封装为组件
Jun 02 Javascript
Javascript类型判断相关例题及解析
Aug 26 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 Javascript
JavaScript实现简单日历效果
Sep 11 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 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
MySQL相关说明
2007/01/15 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
Django Admin实现上传图片校验功能
2016/03/06 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
Django如何实现上传图片功能
2019/08/16 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
python文件和文件夹复制函数
2020/02/07 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
python中的列表和元组区别分析
2020/12/30 Python
美国眼镜网:GlassesUSA
2017/09/07 全球购物
安全事故检讨书
2014/01/18 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
演讲比赛主持词
2015/06/29 职场文书
离婚财产分割协议书
2015/08/11 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers