草庐IT

javascript - jQuery/JavaScript JSON 对象比较

coder 2024-07-22 原文

是否可以比较 2 组 json 对象的差异?我有一个脚本,它通过 jquery $post() 轮询 JSON 对象。我想要做的是将刚刚轮询的对象与存储的对象进行比较。如果从一个到另一个有任何变化,则将它们应用到存储的对象或替换它(无论哪种方式),但从 UI 的 Angular 来看,我正在使用无缝地将更改应用到 JSON 对象的用途,方法是找到两者之间的差异2. 我想这样做是因为现在我有了它,所以无论是否发生变化,UI 都会在每次投票时完全重新加载,从用户体验的 Angular 来看,这基本上看起来像 **。

我想如果我能找到这两个对象之间的差异(如果有的话),我会触发一个功能,我会编辑特定于差异的 UI。

最佳答案

What I want to do is take the object that was just polled and compare it to a stored one. Where if there is any changes from one to the other apply them to the stored object or replace it (either way)

如果您对一个非常简单的“它有任何改变吗?是/否”解决方案感到满意,如果它发生了变化,您只需用新对象替换以前的对象(根据您的问题部分我引用过),然后您可以在解析之前保存 JSON 响应,即将其保存为您的网络服务器发送它的字符串格式。然后,当下一个响应出现时,将新字符串与旧字符串进行比较。如果它们不同(或者如果它是第一个请求)解析 JSON 并处理它以便适本地显示。当然,这假设您的服务器端代码正在以一致的格式创建 JSON 字符串(而不是,例如,更改属性的顺序)。

如果我们假设您已经有了(已解析的)对象,那么 isEqual(a,b) 函数确实应该处理嵌套对象、数组属性等。这可以递归完成,并简单地返回 true 或 false,但是 getDifferences(a,b) 函数在报告嵌套对象中的差异时会让人感到困惑。考虑这个简单的例子:

old: {"mum" : "Maria", "dad" : "Pierre", "kids" : ["Joe", "Mike", "Louisa"] }
new: {"mum" : "Julie", "dad" : "Pierre", "kids" : ["Joe", "Mary"] }

{"mum": "Julie", "kids": ["Mary"]} 有区别吗? “妈妈”变了,“ child ”的名单也变了,但是“迈克”变成了“玛丽”,或者“迈克”和“路易莎”都走了,“玛丽”是新的,或者…… ?也许它应该是 "kids": ["Joe","Mary"] 因为这是新值。你如何指出删除?这只是我想到的第一个示例,我不知道您希望如何处理这些差异。情况可能会很快变得更糟:如果“kids”数组包含对象而不是字符串来表示整个家谱怎么办?如果新的“妈妈”属性是 ["Maria", "Julie"](允许继 parent 等等)怎么办?

如果对于您的特定数据,您知道只有一维对象,那么您可以执行如下简单的操作:

function getDifferences(oldObj, newObj) {
   var diff = {};

   for (var k in oldObj) {
      if (!(k in newObj))
         diff[k] = undefined;  // property gone so explicitly set it undefined
      else if (oldObj[k] !== newObj[k])
         diff[k] = newObj[k];  // property in both but has changed
   }

   for (k in newObj) {
      if (!(k in oldObj))
         diff[k] = newObj[k]; // property is new
   }

   return diff;
}

允许嵌套对象对上述内容进行最简单的更改就是假设如果一个属性是一个对象/数组,那么您只关心它是否有任何不同,而不是深入报告到底是哪些“子属性” “已改变。如果是这样,只需采取上述功能并更改:

else if (oldObj[k] !== newObj[k])

else if (!isEqual(oldObj[k],newObj[k]))

其中 isEqual() 是网上流传的众多比较函数之一或 on StackOverflow .

(注意:我没有理会上面的 .hasOwnProperty(),因为我假设以 JSON 形式返回到 Ajax 请求的对象不会从原型(prototype)链继承属性。类似地用于此目的的 isEqual() 函数不需要担心属性是函数,它只需要担心 JSON 字符串中的有效内容。)

关于javascript - jQuery/JavaScript JSON 对象比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108666/

有关javascript - jQuery/JavaScript JSON 对象比较的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

随机推荐