Javascript - deepEqual 比较

2024-05-18

问题(来自 Eloquent Javascript 第二版,第 4 章,练习 4):

编写一个函数 deepEqual,它接受两个值,并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象,其值也是 与对 deepEqual 的递归调用相比,等于。

测试用例:

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true

My code:

var deepEqual = function (x, y) {
  if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
    if (Object.keys(x).length != Object.keys(y).length)
      return false;
    for (var prop in x) {
      if (y.hasOwnProperty(prop))
        return deepEqual(x[prop], y[prop]);
    /*This is most likely where my error is. The question states that all the values
    should be checked via recursion; however, with the current setup, only the first
    set of properties will be checked. It passes the test cases, but I would like
    to solve the problem correctly!*/
      }
    }
  else if (x !== y)
    return false;
  else
    return true;
}

我想我已经有了总体思路;但是,正如我在评论中所述,程序不会检查对象中的第二个属性。我觉得我有结构/逻辑问题,只是以错误的方式使用递归,因为我最初打算循环遍历属性,使用递归来比较第一个属性的值,然后继续循环到下一个属性属性并再次比较。虽然,我不确定这是否可能?

我已经进行了大量的思考并尝试了几种不同的方法,但这是迄今为止我得到的最正确的答案。有什么可能的提示可以为我指明正确的方向吗?


正如您所怀疑的,您正在返回所看到的第一个属性的匹配项。你应该回来false如果该属性不匹配,但继续寻找其他内容。

另外,返回false如果没有prop财产发现于y(即计数匹配,但实际属性不匹配)。

如果所有属性都匹配,则返回true:

var deepEqual = function (x, y) {
  if (x === y) {
    return true;
  }
  else if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
    if (Object.keys(x).length != Object.keys(y).length)
      return false;

    for (var prop in x) {
      if (y.hasOwnProperty(prop))
      {  
        if (! deepEqual(x[prop], y[prop]))
          return false;
      }
      else
        return false;
    }
    
    return true;
  }
  else 
    return false;
}
var deepEqual = function (x, y) {
  if (x === y) {
    return true;
  }
  else if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
    if (Object.keys(x).length != Object.keys(y).length)
      return false;

    for (var prop in x) {
      if (y.hasOwnProperty(prop))
      {  
        if (! deepEqual(x[prop], y[prop]))
          return false;
      }
      else
        return false;
    }

    return true;
  }
  else 
    return false;
}

var obj = {here: {is: "an", other: "3"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an", other: "2"}, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an", other: "3"}, object: 2}));
// → true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript - deepEqual 比较 的相关文章

随机推荐

  • ng-submit 不允许自定义绑定提交事件

    我有一个指令 我想用它在提交表单时广播事件 我正在做的项目有很多表单 因此无法在ng submit调用的函数中广播事件 指示 directive form function return restrict E link function s
  • SFINAE 中使用的别名模板导致硬错误

    我想使用启用程序 别名模板enable if 在一个类模板中定义 在另一个类模板中定义 它看起来像这样 template lt gt using enabler typename std enable if lt gt type 这对于 S
  • 如果没有定义命名空间,类将拥有什么命名空间

    在 C 中 如果我创建一个没有命名空间的类 那么在尝试实例化该类时将使用哪个命名空间 例如 假设 main 是 namespace NamespaceTests class Program static void Main string a
  • 删除圆形图像周围的边框

    我有一个圆形图像 png 文件 中间是透明的 我需要将图像内的背景设置为纯色 为此 我将背景设为纯色 然后将border radius 50 但这会产生一条丑陋的小白线 有没有办法摆脱这个问题 或者我必须在图像编辑器中手动为图像着色 div
  • 检测 AVAudioPlayer 中的播放结束

    我有几个短的 mp3 声音 我将它们存储在数组中 并希望连续播放它们 有什么方法可以检测 AVAudioPlayer 何时停止播放 以便我可以调用完成处理程序并播放下一个声音 我知道有一个委托 但我正在使用 Playground 和 SKS
  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • Android上如何模拟后台Activity因内存不足而被系统杀死的过程?

    我正在处理 内存不足 不再有后台进程 问题 当这种情况发生时 我的活动处于后台并被杀死 我正在尝试保存并加载实例状态来解决它 但因为它并不是每次都会发生 在这种情况下我应该如何测试我的活动 Thanks 您可以通过 adb 强制进程终止 g
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 如何在不创建安装程序的情况下安装 C# Windows 服务?

    有谁知道是否有一种方法可以安装用 C 创建的 Windows 服务而无需制作安装程序 我包括一个为我进行安装的课程 我使用命令行参数调用应用程序来安装或卸载应用程序 我过去还向用户提示是否要在直接从命令行启动时安装该服务 这是我使用的类 u
  • JSX 元素类型“Element[]”不是 JSX 元素的构造函数?

    types react 16 7 17 types react dom 16 0 11 打字稿 3 2 2 function ArryElement return div 1 div div 2 div function App retur
  • 如何根据服务器响应而不是HTTP 500触发 jquery.ajax() 错误回调?

    通过使用 jquery ajax 函数 我可以执行以下操作 ajax url url type GET async true dataType json data data success function data Handle serv
  • 来自 joda-time DateTimeFormatter 的模式字符串?

    是否可以从 joda time DateTimeFormatter 获取模式字符串 DateTimeFormatter formatter DateTimeFormat forPattern yyyyMMdd String original
  • 如何在 Symfony DateType 字段中设置日期范围?

    我需要在表单中的 dateType 字段的最小和最大日期上设置范围 我的代码在这里 public function buildForm FormBuilderInterface builder array options builder g
  • Angular JS 中的数组

    我是 Angular JS 新手 我正在将元素推送到数组中 然后想使用 ng repeat 在 html 中显示 scope groupedMedia Adding elements through a for loop scope gro
  • .Net 中是否有与 HTML 等效的 XmlReader?

    我用过Html敏捷包 http html agility pack net z codeplex过去在 Net 中解析 HTML 但我不喜欢它只使用 DOM 模型 在大型文档和 或具有大量嵌套的文档上 可能会遇到堆栈溢出或内存不足异常 另外
  • NextjS src 和默认外部图像 URL 的图像问题

    我正在使用最新版本的 NextJS 10 0 9 我有一个想要显示的图像 但是收到错误 Error Image with src https picsum photos 480 270 must use width and height p
  • 从 websocket 发送数据到 socket.io

    我使用 websocket 接口连接到 websocket 服务器 如果我想将通过 websocket 接口从 websocket 服务器接收到的数据发送到通过 http 服务器连接到我的客户端 我应该使用 socket io 吗 所以最后
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归