1 | export default function flatten(obj) {
|
2 | var flattened = {}
|
3 |
|
4 | var circlular = []
|
5 | var circLoc = []
|
6 |
|
7 | function _route(prefix, value) {
|
8 | var i, len, type, keys, circularCheck, loc
|
9 |
|
10 | if (value == null) {
|
11 | if (prefix === "") {
|
12 | return
|
13 | }
|
14 | flattened[prefix] = null
|
15 | return
|
16 | }
|
17 | type = typeof value
|
18 | if (typeof value == "object") {
|
19 | circularCheck = circlular.indexOf(value)
|
20 | if (circularCheck >= 0) {
|
21 | loc = circLoc[circularCheck] || "this"
|
22 | flattened[prefix] = "[Circular (" + loc + ")]"
|
23 | return
|
24 | }
|
25 | circlular.push(value)
|
26 | circLoc.push(prefix)
|
27 |
|
28 | if (Array.isArray(value)) {
|
29 | len = value.length
|
30 | if (len == 0) _route(prefix + "[]", null)
|
31 | for (i = 0; i < len; i++) {
|
32 | _route(prefix + "[" + i + "]", value[i])
|
33 | }
|
34 | return
|
35 | }
|
36 | keys = Object.keys(value)
|
37 | len = keys.length
|
38 | if (prefix) prefix = prefix + "."
|
39 | if (len == 0) _route(prefix, null)
|
40 | for (i = 0; i < len; i++) {
|
41 | _route(prefix + keys[i], value[keys[i]])
|
42 | }
|
43 | return
|
44 | }
|
45 | flattened[prefix] = value
|
46 | }
|
47 |
|
48 | _route("", obj)
|
49 |
|
50 | return flattened
|
51 | }
|