File tree

5 files changed

+462
-175
lines changed

5 files changed

+462
-175
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# nested-objects-util
22

3-
A module to work with huge nested objects having circular references.
3+
A module to filter and diff huge nested objects having circular references.
44

5-
It was implemented to filter out some values from huge nested objects with circular references.
5+
It was implemented to filter out some values from huge nested objects with circular references and then diff them.
66

77
It's designed to work both on nodejs and browser.
88

@@ -18,30 +18,44 @@ npm install --save nested-objects-util
1818
const nestedObjectsUtil = require('nested-objects-util');
1919
```
2020

21-
#### nestedObjectsUtil.flatten(Object: object): Object
21+
#### nestedObjectsUtil.flatten(Object: object, Boolean: sortKeysFlag = false): Object
2222

2323
Flatten object by keys composed from own nested properties.
2424

2525
```
2626
nestedObjectsUtil.flatten({
2727
keyA: {
28+
keyE: [ 'value3', 'value4' ],
29+
keyF: null,
30+
keyD: 'value2',
2831
keyB: {
2932
keyC: 'value'
30-
},
31-
keyD: 'value2'
32-
},
33-
keyE: [ 'value3', 'value4' ]
34-
})
33+
}
34+
}
35+
});
3536
```
3637

3738
returns:
3839

40+
```js
41+
{
42+
"keyA.keyE.0": "value3",
43+
"keyA.keyE.1": "value4",
44+
"keyA.keyF": null,
45+
"keyA.keyD": "value2",
46+
"keyA.keyB.keyC": "value"
47+
}
48+
```
49+
50+
with sortKeys=true it would return:
51+
3952
```js
4053
{
4154
"keyA.keyB.keyC": "value",
4255
"keyA.keyD": "value2",
4356
"keyA.keyE.0": "value3",
44-
"keyA.keyE.1": "value4"
57+
"keyA.keyE.1": "value4",
58+
"keyA.keyF": null
4559
}
4660
```
4761

@@ -74,7 +88,7 @@ returns:
7488
Access object's nested property.
7589

7690
```
77-
var nestedObject = {
91+
const nestedObject = {
7892
keyA: {
7993
keyB: {
8094
keyC: 'value'
@@ -90,12 +104,12 @@ returns:
90104
"value"
91105
```
92106

93-
#### nestedObjectsUtil.discardCircular(Object: object): Object
107+
#### nestedObjectsUtil.discardCircular(Object: object, Boolean: stringifyFlag = false): Object | String
94108

95109
Discard circular references (to avoid "Converting circular structure to JSON" error).
96110

97111
```
98-
var a = {
112+
const a = {
99113
b: 1
100114
};
101115
a.c = a;
@@ -111,12 +125,12 @@ returns:
111125
}
112126
```
113127

114-
#### nestedObjectsUtil.filterValue(Object: object, Various: query, Boolean: flattenFlag = false): Object
128+
#### nestedObjectsUtil.filterValue(Object: object, Various | Array: query, Boolean: flattenFlag = false): Object
115129

116-
Filter a nested object by value (with strict comparison performed).
130+
Filter a nested object by value or values (if array passed). Strict comparison is performed.
117131

118132
```
119-
var a = {
133+
const a = {
120134
b: {
121135
c: 'str',
122136
d: 'str2'
@@ -128,9 +142,10 @@ var a = {
128142
i: 'str3'
129143
},
130144
j: 'str4'
131-
}
145+
},
146+
k: [ 'str', 'str5' ]
132147
};
133-
a.k = a.b;
148+
a.l = a.b;
134149
nestedObjectsUtil.filterValue(a, 'str');
135150
```
136151

@@ -146,11 +161,12 @@ returns:
146161
"g": {
147162
"h": "str"
148163
}
149-
}
164+
},
165+
"k": [ "str" ]
150166
}
151167
```
152168

153-
or
169+
or with flattenFlag = true
154170

155171
```js
156172
nestedObjectsUtil.filterValue(a, 'str', true);
@@ -162,7 +178,8 @@ returns:
162178
{
163179
"b.c": "str",
164180
"e": "str",
165-
"f.g.h": "str"
181+
"f.g.h": "str",
182+
"k.0": "str"
166183
}
167184
```
168185

@@ -173,7 +190,7 @@ On browser with HTML5 download API: stringify, format and download the object.
173190
Else: return stringified text.
174191

175192
```
176-
var a = {
193+
const a = {
177194
b: 1,
178195
c: {
179196
d: 2,
@@ -182,7 +199,7 @@ var a = {
182199
};
183200
a.f = a;
184201
a.g = a.f;
185-
var obj = nestedObjectsUtil.discardCircular(a);
202+
const obj = nestedObjectsUtil.discardCircular(a);
186203
nestedObjectsUtil.downloadStringified(obj);
187204
```
188205

@@ -200,9 +217,84 @@ returns:
200217
}
201218
```
202219

220+
#### nestedObjectsUtil.areObjectsEqual(Object: objectA, Object: objectB): Boolean
221+
222+
Compare two objects against each other (by JSON.stringify) after discarding circular references, flattening and ordering keys.
223+
224+
```
225+
const objectA = {
226+
keyA: {
227+
keyB: {
228+
keyC: 'value'
229+
},
230+
keyD: 'value2',
231+
keyE: [ 'value3', 'value4' ]
232+
}
233+
};
234+
objectA.circular = objectA;
235+
const objectB = {
236+
keyA: {
237+
keyE: [ 'value3', 'value4' ],
238+
keyD: 'value2',
239+
keyB: {
240+
keyC: 'value'
241+
}
242+
}
243+
};
244+
objectB.circular = objectB;
245+
nestedObjectsUtil.areObjectsEqual(objectA, objectB);
246+
```
247+
248+
returns:
249+
250+
```js
251+
true
252+
```
253+
254+
#### nestedObjectsUtil.getObjectsDiff(Object: objectA, Object: objectB, Boolean: sortKeysFlag = false, Boolean: flattenFlag = false): Object
255+
256+
Get the properties which differ between object A and object B and return those from object B.
257+
258+
```
259+
const objectA = {
260+
keyA: {
261+
keyB: {
262+
keyC: 'value'
263+
},
264+
keyD: 'value2',
265+
keyE: [ 'value3' ]
266+
}
267+
};
268+
objectA.circular = objectA;
269+
const objectB = {
270+
keyA: {
271+
keyB: {
272+
keyC: 'value'
273+
},
274+
keyD: 'value2_CHANGED',
275+
keyE: [ 'value3_CHANGED' ]
276+
}
277+
};
278+
objectB.circular = objectB;
279+
nestedObjectsUtil.getObjectsDiff(objectA, objectB);
280+
```
281+
282+
returns:
283+
284+
```js
285+
{
286+
"keyA": {
287+
"keyD": "value2_CHANGED",
288+
"keyE": [ "value3_CHANGED" ]
289+
}
290+
}
291+
```
292+
203293
## Example browser usage
204294

205-
Filter out 'abcd' value from the flattened object and download stringified json via HTML5 API with:
295+
In the browser, NestedObjectsUtil object should be exposed to either window or with AMD.
296+
297+
Filter out 'abcd' value from the flattened object and download stringified JSON via HTML5 API with:
206298

207299
```js
208300
const object = NestedObjectsUtil.filterValue(App.SomeHugeObject, 'abcd', true);

0 commit comments

Comments
 (0)