利用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 相关文章推荐
ExtJS PropertyGrid中使用Combobox选择值问题
Jun 13 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
button没写type=button会导致点击时提交
Mar 06 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
jQuery siblings()用法实例详解
Apr 26 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
微信小程序日历插件代码实例
Dec 04 Javascript
原生js实现自定义难度的扫雷游戏
Jan 22 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php语法检查的方法总结
2019/01/21 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
13个PHP函数超实用
2015/10/21 Javascript
Javascript中神奇的this
2016/01/20 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
基于python实现学生管理系统
2018/10/17 Python
我就是这样学习Python中的列表
2019/06/02 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
大学军训心得体会800字
2016/01/11 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python