利用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 相关文章推荐
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 Javascript
加速IE的Javascript document输出的方法
Dec 02 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
uploadify在Firefox下丢失session问题的解决方法
Aug 07 Javascript
JS中的异常处理方法分享
Dec 22 Javascript
jquery.form.js用法之清空form的方法
Mar 07 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 Javascript
angularjs实现天气预报功能
Jun 16 Javascript
three.js利用卷积法如何实现物体描边效果
Nov 27 Javascript
前端开发基础javaScript的六大作用
Aug 06 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数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
python如何定义带参数的装饰器
2018/03/20 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
商务助理岗位职责
2013/11/13 职场文书
报到证办理个人委托书
2014/10/06 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
小学中等生评语
2014/12/29 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
立项申请报告范本
2015/05/15 职场文书
学校财务管理制度
2015/08/04 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫