利用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 validator 插件增加日期比较方法
Feb 21 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
一个可复用的vue分页组件
May 15 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
vue中的适配px2rem示例代码
Nov 19 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
May 14 Javascript
vue制作toast组件npm包示例代码
Oct 29 Javascript
jquery实现拖拽添加元素功能
Dec 01 jQuery
微信小程序实现底部导航
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 Mysql编程之高级技巧
2008/08/27 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
extjs render 用法介绍
2013/09/11 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
EsLint入门学习教程
2017/02/17 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python实现在线翻译功能
2020/03/03 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
关于是否需要写商业计划书
2014/02/07 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
学校计划生育责任书
2015/05/09 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
正则表达式基础与常用验证表达式
2022/06/16 Javascript