利用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 相关文章推荐
JScript内置对象Array中元素的删除方法
Mar 08 Javascript
JS下拉框内容左右移动效果的具体实现
Jul 10 Javascript
求数组最大最小值方法适用于任何数组
Aug 16 Javascript
css样式标签和js语法属性区别
Nov 06 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
zTree插件下拉树使用入门教程
Apr 11 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 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
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
比较完整的微信开发php代码
2016/08/02 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python连接PostgreSQL数据库的方法
2016/11/28 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
PHP经典面试题
2016/09/03 面试题
英语演讲稿3分钟
2014/04/29 职场文书
2014年冬季防火方案
2014/05/21 职场文书
优秀教研组申报材料
2014/12/26 职场文书
综合办公室岗位职责
2015/04/11 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL