Skip to content

Commit 2f25dbd

Browse files
committed
Improve method U.set(map, path, value).
1 parent 1a916c4 commit 2f25dbd

File tree

2 files changed

+23
-48
lines changed

2 files changed

+23
-48
lines changed

src/main/java/com/github/underscore/lodash/U.java

Lines changed: 18 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,28 +1497,42 @@ public static List<String> stringToPath(final String string) {
14971497
}
14981498

14991499
@SuppressWarnings("unchecked")
1500-
private static <T> T baseGet(final Map<String, Object> object, final String path) {
1500+
private static <T> T baseGetAndSet(final Map<String, Object> object, final String path,
1501+
final Optional<Object> value) {
15011502
final List<String> paths = stringToPath(path);
15021503
int index = 0;
15031504
final int length = paths.size();
15041505

15051506
Object localObject = object;
1507+
Object savedLocalObject = null;
1508+
String savedPath = null;
15061509
while (localObject != null && index < length) {
15071510
if (localObject instanceof Map) {
15081511
Map.Entry mapEntry = getMapEntry((Map) localObject);
15091512
if (mapEntry != null && "#item".equals(mapEntry.getKey())) {
15101513
localObject = mapEntry.getValue();
15111514
continue;
15121515
}
1516+
savedLocalObject = localObject;
1517+
savedPath = paths.get(index);
15131518
localObject = ((Map) localObject).get(paths.get(index));
15141519
} else if (localObject instanceof List) {
1520+
savedLocalObject = localObject;
1521+
savedPath = paths.get(index);
15151522
localObject = ((List) localObject).get(Integer.parseInt(paths.get(index)));
15161523
} else {
15171524
break;
15181525
}
15191526
index += 1;
15201527
}
15211528
if (index > 0 && index == length) {
1529+
if (value.isPresent()) {
1530+
if (savedLocalObject instanceof Map) {
1531+
((Map) savedLocalObject).put(savedPath, value.get());
1532+
} else {
1533+
((List) savedLocalObject).set(Integer.parseInt(savedPath), value.get());
1534+
}
1535+
}
15221536
return (T) localObject;
15231537
}
15241538
return null;
@@ -1529,50 +1543,11 @@ private static Map.Entry getMapEntry(Map map) {
15291543
}
15301544

15311545
public static <T> T get(final Map<String, Object> object, final String path) {
1532-
return baseGet(object, path);
1533-
}
1534-
1535-
@SuppressWarnings("unchecked")
1536-
private static Map<String, Object> baseSet(final Map<String, Object> object,
1537-
final String path, final Object value) {
1538-
final List<String> paths = stringToPath(path);
1539-
int index = 0;
1540-
final int length = paths.size();
1541-
1542-
Object savedLocalObject = object;
1543-
String savedPath = paths.get(0);
1544-
Object localObject = object;
1545-
while (localObject != null && index < length) {
1546-
if (localObject instanceof Map) {
1547-
Map.Entry mapEntry = getMapEntry((Map) localObject);
1548-
if (mapEntry != null && "#item".equals(mapEntry.getKey())) {
1549-
localObject = mapEntry.getValue();
1550-
continue;
1551-
}
1552-
savedLocalObject = localObject;
1553-
savedPath = paths.get(index);
1554-
localObject = ((Map) localObject).get(paths.get(index));
1555-
} else if (localObject instanceof List) {
1556-
savedLocalObject = localObject;
1557-
savedPath = paths.get(index);
1558-
localObject = ((List) localObject).get(Integer.parseInt(paths.get(index)));
1559-
} else {
1560-
break;
1561-
}
1562-
index += 1;
1563-
}
1564-
if (index > 0 && index == length) {
1565-
if (savedLocalObject instanceof Map) {
1566-
((Map) savedLocalObject).put(savedPath, value);
1567-
} else {
1568-
((List) savedLocalObject).set(Integer.parseInt(savedPath), value);
1569-
}
1570-
}
1571-
return object;
1546+
return baseGetAndSet(object, path, Optional.absent());
15721547
}
15731548

1574-
public static Map<String, Object> set(final Map<String, Object> object, final String path, Object value) {
1575-
return baseSet(object, path, value);
1549+
public static <T> T set(final Map<String, Object> object, final String path, Object value) {
1550+
return baseGetAndSet(object, path, Optional.of(value));
15761551
}
15771552

15781553
public static class FetchResponse {

src/test/java/com/github/underscore/lodash/LodashTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -442,22 +442,22 @@ public void get() {
442442
@SuppressWarnings("unchecked")
443443
@Test
444444
public void set() {
445-
assertEquals("{a=[{b={c=e}}]}", U.<String>set(
445+
assertEquals("d", U.<String>set(
446446
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0].b.c", "e").toString());
447-
assertEquals("{a=[e]}", U.<String>set(
447+
assertEquals("{b={c=d}}", U.set(
448448
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0]", "e").toString());
449449
Map<String, Object> map = U.newLinkedHashMap();
450450
Map<String, Object> map2 = U.newLinkedHashMap();
451451
Map<String, Object> map3 = U.newLinkedHashMap();
452452
map.put("a", map2);
453453
map2.put("#item", map3);
454454
map3.put("b", "c");
455-
assertEquals("{a={#item={b=b}}}", U.<String>set(map, "a.b", "b").toString());
455+
assertEquals("c", U.<String>set(map, "a.b", "b").toString());
456456
assertNull(U.<String>set((Map<String, Object>) null, "a", "b"));
457-
assertEquals("{}", U.<String>set(U.<String, Object>newLinkedHashMap(), "a.b", "b").toString());
457+
assertNull(U.<String>set(U.<String, Object>newLinkedHashMap(), "a.b", "b"));
458458
Map<String, Object> map4 = U.newLinkedHashMap();
459459
map4.put("a", "b");
460-
assertEquals("{a=b}", U.<String>set(map4, "a.b", "b").toString());
460+
assertNull(U.<String>set(map4, "a.b", "b"));
461461
}
462462

463463
@Test

0 commit comments

Comments
 (0)