-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathobject-diff.js
46 lines (43 loc) · 1.25 KB
/
object-diff.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const isArray = function () {
if(Array && Array.isArray) {
return Array.isArray
}
return function (o) {
return Object.prototype.toString.call(o) === '[object Array]'
}
}
const getEquivalentEmpty = function (objOrArr) {
return isArray(objOrArr) ? [] : {}
}
const getFirstExtraKeys = function (first, second) {
let i
let curExtra
let childExtra
for (i in first) {
if (first.hasOwnProperty(i)) {
if (first[i] !== null && typeof first[i] === "object") {
/*
object includes arrays and objects, null is not
considered an object, so we make sure its not null
*/
childExtra = getFirstExtraKeys(first[i], (second || {})[i])
if (childExtra !== undefined) {
//curExtra = curExtra || {}
curExtra = curExtra || getEquivalentEmpty(first)
curExtra[i] = childExtra
}
} else {
if(second === undefined || second === null || second[i] !== first[i]){
//curExtra = curExtra || {}
curExtra = curExtra || getEquivalentEmpty(first)
curExtra[i] = first[i]
}
}
}
}
return curExtra
}
export default function (first, second) {
const res = getFirstExtraKeys({itm: first}, {itm: second})
return (res || {}).itm
}