Skip to content

Commit 1a916c4

Browse files
authored
Add method U.set(map, path, value).
#223
1 parent 97241e3 commit 1a916c4

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,49 @@ public static <T> T get(final Map<String, Object> object, final String path) {
15321532
return baseGet(object, path);
15331533
}
15341534

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;
1572+
}
1573+
1574+
public static Map<String, Object> set(final Map<String, Object> object, final String path, Object value) {
1575+
return baseSet(object, path, value);
1576+
}
1577+
15351578
public static class FetchResponse {
15361579
private final boolean ok;
15371580
private final int status;

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,32 @@ public void at() {
432432
@Test
433433
public void get() {
434434
assertEquals("d", U.<String>get(
435-
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0].b.c").toString());
435+
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0].b.c"));
436+
}
437+
438+
/*
439+
_.set({"a":[{"b":{"c":"d"}}]}, "a[0].b.c", "e");
440+
// → "{a=[{b={c=e}}]}"
441+
*/
442+
@SuppressWarnings("unchecked")
443+
@Test
444+
public void set() {
445+
assertEquals("{a=[{b={c=e}}]}", U.<String>set(
446+
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0].b.c", "e").toString());
447+
assertEquals("{a=[e]}", U.<String>set(
448+
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"), "a[0]", "e").toString());
449+
Map<String, Object> map = U.newLinkedHashMap();
450+
Map<String, Object> map2 = U.newLinkedHashMap();
451+
Map<String, Object> map3 = U.newLinkedHashMap();
452+
map.put("a", map2);
453+
map2.put("#item", map3);
454+
map3.put("b", "c");
455+
assertEquals("{a={#item={b=b}}}", U.<String>set(map, "a.b", "b").toString());
456+
assertNull(U.<String>set((Map<String, Object>) null, "a", "b"));
457+
assertEquals("{}", U.<String>set(U.<String, Object>newLinkedHashMap(), "a.b", "b").toString());
458+
Map<String, Object> map4 = U.newLinkedHashMap();
459+
map4.put("a", "b");
460+
assertEquals("{a=b}", U.<String>set(map4, "a.b", "b").toString());
436461
}
437462

438463
@Test

0 commit comments

Comments
 (0)