Skip to content

Commit 3438a54

Browse files
committed
add method to merge two Json objects
1 parent a85efdd commit 3438a54

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

lib/src/pixeldroid/json/Json.ls

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@ package pixeldroid.json
88
{
99
public static const version:String = '1.0.0';
1010

11+
/**
12+
Merges key:value pairs of second parameter into first, overriding any duplicates.
13+
14+
*Note* this method does not clone non-primitive values.
15+
During the merge, new keys in the first Json object will pointed to values in the second.
16+
After the merge, modifying values in the second Json object would be the same as modifying them in the first.
17+
18+
@param j1 Target Json object; will have j2 merged into it
19+
@param j2 Json object to merge into j1
20+
*/
21+
static public function merge(j1:Json, j2:Json):void
22+
{
23+
Debug.assert(j1.type == Dictionary.getType(), "merge operand root data type must be Dictionary");
24+
Debug.assert(j2.type == Dictionary.getType(), "merge operand root data type must be Dictionary");
25+
26+
for (var k:String in j2.keys)
27+
j1.keys[k] = j2.keys[k];
28+
}
29+
1130
static public function fromString(value:String):Json
1231
{
1332
var j:JSON = new JSON();

test/src/spec/JsonSpec.ls

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ package
2323
it.should('retrieve native Loom types for the non-collection JSON types', get_native_types);
2424
it.should('retrieve array elements via items[]', get_array_elements_via_items);
2525
it.should('retrieve object properties via keys[]', get_object_props_via_keys);
26+
it.should('provide an object merge utility', merge_objects);
2627
}
2728

2829

@@ -162,5 +163,32 @@ package
162163
it.expects(json.keys['key_object'].keys['object_1'].value).toEqual(1);
163164
it.expects(json.keys['key_nested_multitype_object'].keys['nested_2'].keys['c'].keys['z'].value).toEqual('Z');
164165
}
166+
167+
private static function merge_objects():void
168+
{
169+
var jsonObject1:Dictionary.<String, Object> = {};
170+
var jsonObject2:Dictionary.<String, Object> = {};
171+
172+
jsonObject1['key_string'] = 'original value';
173+
174+
jsonObject2['key_string'] = 'overridden value';
175+
jsonObject2['key_merged_array'] = ["merged_array"];
176+
jsonObject2['key_merged_object'] = {"merged_object": true};
177+
178+
var j1:Json = Json.fromObject(jsonObject1);
179+
var j2:Json = Json.fromObject(jsonObject2);
180+
181+
it.asserts(j1).isNotNull();
182+
it.asserts(j2).isNotNull();
183+
184+
it.expects(j1.keys.length).toEqual(1);
185+
it.expects(j1.keys['key_string'].value).toEqual('original value');
186+
187+
Json.merge(j1, j2);
188+
it.expects(j1.keys.length).toEqual(3);
189+
it.expects(j1.keys['key_string'].value).toEqual('overridden value');
190+
it.expects(j1.keys['key_merged_array'].value).toBeA(Vector);
191+
it.expects(j1.keys['key_merged_object'].value).toBeA(Dictionary);
192+
}
165193
}
166194
}

0 commit comments

Comments
 (0)