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

Posted xiami2104

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找出一个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);   

以上是关于找出一个JSON对象修改前后的属性和值的主要内容,如果未能解决你的问题,请参考以下文章

java对象值的copy

java记录对象前后修改的内容(工具类)

如何删除json对象键和值。?

从数组中拆分出对象属性和值[重复]

json篇

js动态为对象添加属性和方法