利用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 相关文章推荐
jQuery 表单验证扩展(四)
Oct 20 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
用Jquery实现滚动新闻
Feb 12 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
简介JavaScript中fixed()方法的使用
Jun 08 Javascript
超详细的JS弹出窗口代码大全
Apr 18 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
Mar 09 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
js实现二级联动简单实例
Jan 11 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
JavaScript原型链中函数和对象的理解
Jun 16 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
原生JS实现轮播图效果
2018/10/12 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
python中_del_还原数据的方法
2020/12/09 Python
罗技美国官网:Logitech美国
2020/01/22 全球购物
社会实践心得体会
2014/01/03 职场文书
打造完美自荐信
2014/01/24 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers