利用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 构造函数,公有,私有特权和静态成员定义方法
Nov 30 Javascript
js编码、解码函数介绍及其使用示例
Sep 05 Javascript
JS复制到剪贴板示例代码
Oct 30 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
jQuery实现渐变下拉菜单的简单方法
Mar 11 Javascript
jQuery实现的右下角广告窗体跟随效果示例
Sep 16 Javascript
浅析JavaScript中var that=this
Feb 17 Javascript
Angular中的$watch、$watchGroup、$watchCollection
Jun 25 Javascript
JS计算两个时间相差分钟数的方法示例
Jan 10 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
基于vue实现探探滑动组件功能
May 29 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
详解html-webpack-plugin用法全解
2018/01/22 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
对python数据切割归并算法的实例讲解
2018/12/12 Python
python3.x实现base64加密和解密
2019/03/28 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
python urllib和urllib3知识点总结
2021/02/08 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
环境工程毕业生自荐信
2013/11/17 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
基层党支部整改方案
2014/10/25 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js