找出一个JSON对象修改前后的属性和值

工作了这么久,第一次记录心得,有些汗颜,因为某些原因,觉得还是记录下比较好,话不多说,现在开始。
这个需求的背景是我有一个表单,表单对象有array,obj,str等,我现在对这个表单数据某些表单项做了修改,保存的时候需要对比修改前后的表单,列出哪些修改项,来触发某些操作。
下面是方法:

  1 // 对比JSON数据
  2 export function equalsWithA (object1, object2) {
  3   var changeField = []
  4   for (var propName in object1) {
  5     if (!object1[propName] && !object2[propName]) {
  6       continue
  7     }
  8     if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName) || typeof object1[propName] !== typeof object2[propName]) {
  9       changeField.push(propName)
 10       continue
 11     }
 12     if (object1[propName] instanceof Array) {
 13       if (!arrayEquals(object1[propName], object2[propName])) {
 14         changeField.push(propName)
 15         continue
 16       }
 17     } else if (object1[propName] instanceof Object && object2[propName] instanceof Object) {
 18       if (!jsonEquals(object1[propName], object2[propName])) {
 19         changeField.push(propName)
 20         continue
 21       }
 22     } else if (typeof object1[propName] === ‘string‘ && typeof object2[propName] === ‘string‘) {
 23       try {
 24         var d1 = ‘‘
 25         var d2 = ‘‘
 26         if (propName.indexOf(‘EndTime‘) > -1 || propName.indexOf(‘StartTime‘) > -1) {
 27           d1 = formatDate(object1[propName])
 28           d2 = formatDate(object2[propName])
 29         } else {
 30           d1 = object1[propName]
 31           d2 = object2[propName]
 32         }
 33
 34         if (d1 && d2) {
 35           if (d1 != d2) {
 36             // 日期类型
 37             changeField.push(propName)
 38           }
 39           continue
 40         } else if (object1[propName] != object2[propName]) {
 41           changeField.push(propName)
 42           continue
 43         }
 44       } catch (e) { }
 45     } else if (object1[propName] != object2[propName]) {
 46       changeField.push(propName)
 47       continue
 48     }
 49   }
 50   return changeField
 51 };
 52 function arrayEquals (object1, object2) {
 53   if (object1.length != object2.length) {
 54     return false
 55   }
 56   object1.sort()
 57   object2.sort()
 58   for (var i = 0; i < object1.length; i++) {
 59     if (typeof object1[i] !== typeof object2[i]) {
 60       return false
 61     }
 62     if (object1[i] instanceof Array && object2[i] instanceof Array) {
 63       if (!arrayEquals(object1[i], object2[i])) {
 64         return false
 65       }
 66     } else if (isJson(object1[i]) && isJson(object2[i])) {
 67       if (!jsonEquals(object1[i], object2[i])) {
 68         return false
 69       }
 70     } else if (object1[i] != object2[i]) {
 71       return false
 72     }
 73   }
 74   return true
 75 };
 76 function jsonEquals (object1, object2) {
 77   for (var propName in object1) {
 78     if (!object1[propName] && !object2[propName]) {
 79       continue
 80     }
 81     if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName) || typeof object1[propName] !== typeof object2[propName]) {
 82       return false
 83     }
 84     if (object1[propName] instanceof Array) {
 85       if (!arrayEquals(object1[propName], object2[propName])) { return false }
 86     } else if (isJson(object1[propName])) {
 87       if (!jsonEquals(object1[propName], object2[propName])) { return false }
 88     } else if (typeof object1[propName] === ‘string‘ && typeof object2[propName] === ‘string‘) {
 89       try {
 90         var d1 = ‘‘
 91         var d2 = ‘‘
 92         if (propName.indexOf(‘EndTime‘) > -1 || propName.indexOf(‘StartTime‘) > -1) {
 93           d1 = formatDate(object1[propName])
 94           d2 = formatDate(object2[propName])
 95         } else {
 96           d1 = object1[propName]
 97           d2 = object2[propName]
 98         }
 99         if (d1 && d2 && d1 != d2) {
100           // 日期类型
101           return false
102         } else if (object1[propName] != object2[propName]) {
103           return false
104         }
105       } catch (e) { }
106     } else if (object1[propName] != object2[propName]) {
107       return false
108     }
109   }
110   return true
111 };
112 function isJson (obj) {
113   var isjson = typeof (obj) === ‘object‘ && Object.prototype.toString.call(obj).toLowerCase() == ‘[object object]‘ && !obj.length
114   return isjson
115 }

调用方法

var arrChange = equalsWithA( oldFormData,newFormData);

原文地址:https://www.cnblogs.com/xiami2104/p/11783104.html

时间: 2024-08-19 21:09:08

找出一个JSON对象修改前后的属性和值的相关文章

LINUX小白重装上百次后, 最终找出一个成功方案 CentOS LAMP +wordpress+phpmyadmin 共0.84G

折腾了几天,终于找到很节省资源的安装wordpress方案. 成功搭建网站 http://www.gudianxiaoshuo.com     and   http://www.gudianbook.com 同时向大家推荐下wordpress建站利器 书画小说软件4.0版  我的网站 就是用这个软件搭建的  222本书 15000余篇文章 共用8个半钟头左右. 好了,转回正题,入手了一台LINUX VPS  进去一看 黑乎乎的DOS  立马傻眼.  更可恨的是没有提供相关资料,只能去自己找.自己

[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法

问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 collections.Counter 类 1. most_common(n)统计top_n from collections import Counter words = [ 'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes', 't

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

算法题:找出一个数组中依次最大的k个元素

package arithmetic; import java.util.Arrays; /** * 找出一个数组中依次最大的k个元素 * @author SHI */ public class FindMaxFigure { public static void main(String[] args) { int[] a=new int[]{1,5,-1,8,0,2}; System.out.println(Arrays.toString(findBigFigure(a, 3))); } /*

找出一个字符串中最长重复次数的子字符串,并计算其重复次数

原题 找出一个字符串中最长重复次数的子字符串,并计算其重复次数.例如:字符串"abc fghi bc kl abcd lkm abcdefg",并返回"abcd"和2. 我的思路 为了方便表述,我们使用变量src作为原字符串,sub_str作为子字符串. 由于题目要求寻找至少重复2次的最长的子字符串,重点在于最长的子字符串,而不在于重复的最多次数.因此我们可以从长度最长的字符串入手,计算其重复次数.只要重复达到2次,即可返回该字符串. 显然长度最长的子字符串就是原串

c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

1 //题目:找出一个二维数组的"鞍点",即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. 2 // 3 #include "stdio.h" 4 #include <stdlib.h> 5 int main() 6 { 7 int i,j,k,hang=1,lie=1; 8 printf("输入行"); 9 scanf("%d",&hang); 10 printf("输入列"

小技巧找出一个php的cron脚本出问题的代码行

这个小技巧虽然很小,但是很有用. 我写了一个cron脚本,但是隔一天发现,这个昨天的cron脚本还一直在跑着,没有停下来,一定是里面有个程序堵住了. 但是如果我重新跑又需要很多时间.这个怎么办? 现在最需要就是要知道程序停在了那行代码上了.使用gdb: $sudo gdb -p 14973 (gdb) print (char *)executor_globals.active_op_array->filename $1 = 0x9853a34 "/home/xinhailong/test/

找出一个只出现一次的字符

一,问题描述 给定一个字符串,找出一个 其中只出现一次的字符 如"abaccdeff" 只出现一次的字符有 'b'    'd'     'e' 二,问题分析 ①字符集是个常量 ,字符只有那么多.比如ASCII 一共256个,比如 字母表一共只有26个,再比如数字,一共0-9 只有10个 ②出现一次,说明是次数.将字符映射成出现的次数----Map ③数组就是一种特殊的Map,数组的下标是不变的,相当于Key,下标 i 处存储的值就相当于Value 比如,定义一个存储26个字母出现频率

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).