利用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显示随机图像或引用
Apr 21 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
Apr 26 Javascript
JavaScript对内存分配及管理机制详细解析
Nov 11 Javascript
js图片自动轮播代码分享(js图片轮播)
May 06 Javascript
jquery+php实现搜索框自动提示
Nov 28 Javascript
jQuery点击导航栏选中更换样式的实现代码
Jan 23 Javascript
Vue.Js中的$watch()方法总结
Mar 23 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
Oct 18 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
Dec 11 Javascript
JavaScript中window和document用法详解
Jul 28 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 adodb介绍
2009/03/19 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
python中的编码知识整理汇总
2016/01/26 Python
浅谈Python的文件类型
2016/05/30 Python
Django中的ajax请求
2018/10/19 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
python sorted方法和列表使用解析
2019/11/18 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
满月酒主持词
2014/03/27 职场文书
护林防火标语
2014/06/27 职场文书
助残日活动总结
2014/08/27 职场文书
未婚证明格式
2015/06/15 职场文书