-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
61 lines (53 loc) · 1.42 KB
/
index.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
'use strict';
module.exports = diff
var eq = require('is-equal')
, has = {}.hasOwnProperty
function diff(value, other) {
if (eq(value, other)) return false
var obj = Object(value)
, otherObj = Object(other)
if (obj !== value && otherObj !== other) return true
obj = value instanceof Object ? value : {}
otherObj = other instanceof Object ? other : {}
var ret = false
, d
if (value instanceof Array && other instanceof Array) {
for (var i = 0, len = Math.max(value.length, other.length); i < len; i++) {
d = diff(value[i], other[i])
if (d) {
if (!ret) ret = []
ret[i] = d
}
}
}
else {
var key
, keys = {}
for (key in obj) if (has.call(obj, key)) keys[key] = true
for (key in otherObj) if (has.call(otherObj, key)) keys[key] = true
for (key in keys) if (has.call(keys, key)) {
d = diff(obj[key], otherObj[key])
if (d) {
if (!ret) ret = {}
ret[key] = d
}
}
}
return ret
}
diff.patch = patch
function patch(diff, fresh, model) {
p(diff, fresh, [])
function p(diff, fresh, prefix) {
for (var key in diff) if (has.call(diff, key)) {
if (diff[key] === true) {
if (has.call(fresh || {}, key))
model.set(prefix.concat(key), fresh[key])
else
model.delete(prefix.concat(key))
}
else
p(diff[key], fresh && fresh[key], prefix.concat(key))
}
}
}