全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript比较两个数组的内容是否相同(推荐)

今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的。

alert([]==[]);  // false
alert([]===[]);  // false

以上两句代码都会弹出false。

因为JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。目前JavaScript没有内置的操作符判断对象的内容是否相同。

但是惯性思维让人以为数组也是值,是可以比较的。

如果要比较数组是否相等,就只能遍历数组元素比较。

在网上流传很普遍的一种做法是将数组转换成字符串:

JSON.stringify(a1) == JSON.stringify(a2)

 或

a1.toString() == a2.toString()

请不要使用这种方法。

这种方法在某些情况下是可行的,当两个数组的元素顺序相同且元素都可以转换成字符串的情况下确实可行,但是这样的代码存有隐患,比如数字被转换成字符串,数字“1”和字符串“1”会被认为相等,可能造成调试困难,不推荐使用。

在StackOverflow上有大神已经提供了正确的方法,我就做下搬运工吧:

// Warn if overriding existing method
if(Array.prototype.equals)
  console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
  // if the other array is a falsy value, return
  if (!array)
    return false;
  // compare lengths - can save a lot of time 
  if (this.length != array.length)
    return false;
  for (var i = 0, l = this.length; i < l; i++) {
    // Check if we have nested arrays
    if (this[i] instanceof Array && array[i] instanceof Array) {
      // recurse into the nested arrays
      if (!this[i].equals(array[i]))
        return false;    
    }      
    else if (this[i] != array[i]) { 
      // Warning - two different object instances will never be equal: {x:20} != {x:20}
      return false;  
    }      
  }    
  return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});

大神还顺手给了比较Object的方法:

Object.prototype.equals = function(object2) {
  //For the first loop, we only check for types
  for (propName in this) {
    //Check for inherited methods and properties - like .equals itself
    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
    //Return false if the return value is different
    if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
      return false;
    }
    //Check instance type
    else if (typeof this[propName] != typeof object2[propName]) {
      //Different types => not equal
      return false;
    }
  }
  //Now a deeper check using other objects property names
  for(propName in object2) {
    //We must check instances anyway, there may be a property that only exists in object2
      //I wonder, if remembering the checked values from the first loop would be faster or not 
    if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
      return false;
    }
    else if (typeof this[propName] != typeof object2[propName]) {
      return false;
    }
    //If the property is inherited, do not check any more (it must be equa if both objects inherit it)
    if(!this.hasOwnProperty(propName))
     continue;
    //Now the detail check and recursion
    //This returns the script back to the array comparing
    /**REQUIRES Array.equals**/
    if (this[propName] instanceof Array && object2[propName] instanceof Array) {
          // recurse into the nested arrays
      if (!this[propName].equals(object2[propName]))
            return false;
    }
    else if (this[propName] instanceof Object && object2[propName] instanceof Object) {
          // recurse into another objects
          //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
      if (!this[propName].equals(object2[propName]))
            return false;
    }
    //Normal value comparison for strings and numbers
    else if(this[propName] != object2[propName]) {
      return false;
    }
  }
  //If everything passed, let's say YES
  return true;
} 

以上所述是小编给大家介绍的JavaScript比较两个数组的内容是否相同(推荐),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 比较两个数组是否相同  # 对比两个数组是否相同  # js实现数组去重、判断数组以及对象中的内容是否相同  # js使用数组判断提交数据是否存在相同数据  # JS实现对json对象排序并删除id相同项功能示例  # json对象与数组以及转换成js对象的简单实现方法  # Javascript的数组与字典用法与遍历对象的技巧  # javascript如何定义对象数组  # Javascript中判断变量是数组还是对象(array还是object)  # js中如何把字符串转化为对象、数组示例代码  # JS判断两个数组或对象是否相同的方法示例  # 转换成  # 大神  # 小编  # 情况下  # 让人  # 这种方法  # 在此  # 遍历  # 推荐使用  # 上有  # 给了  # 给大家  # 弹出  # 请不要  # 要比  # 两句  # 不能用  # 所述  # 就做  # 给我留言 


相关文章: 设计网站制作公司有哪些,制作网页教程?  建站之星×万网:智能建站系统+自助建站平台一键生成  深圳网站制作案例,网页的相关名词有哪些?  开源网站制作软件,开源网站什么意思?  建站主机选择指南:服务器配置与SEO优化实战技巧  太原网站制作公司有哪些,网约车营运证查询官网?  网站按钮制作软件,如何实现网页中按钮的自动点击?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何在建站宝盒中设置产品搜索功能?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站VPS选购需注意哪些关键参数?  利用JavaScript实现拖拽改变元素大小  大连网站设计制作招聘信息,大连投诉网站有哪些?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何破解联通资金短缺导致的基站建设难题?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  高端建站三要素:定制模板、企业官网与响应式设计优化  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何通过宝塔面板实现本地网站访问?  小程序网站制作需要准备什么资料,如何制作小程序?  高防服务器:AI智能防御DDoS攻击与数据安全保障  h5网站制作工具有哪些,h5页面制作工具有哪些?  如何将凡科建站内容保存为本地文件?  如何快速搭建个人网站并优化SEO?  定制建站哪家更专业可靠?推荐榜单揭晓  建站之星客服服务时间及联系方式如何?  重庆市网站制作公司,重庆招聘网站哪个好?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  免费视频制作网站,更新又快又好的免费电影网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何安全更换建站之星模板并保留数据?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何通过.red域名打造高辨识度品牌网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  视频网站制作教程,怎么样制作优酷网的小视频?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何用美橙互联一键搭建多站合一网站?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  网站制作免费,什么网站能看正片电影?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在阿里云高效完成企业建站全流程?  家具网站制作软件,家具厂怎么跑业务?  如何在景安云服务器上绑定域名并配置虚拟主机?  c# 服务器GC和工作站GC的区别和设置  如何在阿里云域名上完成建站全流程?  香港服务器WordPress建站指南:SEO优化与高效部署策略  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  电商网站制作公司有哪些,1688网是什么意思? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。