Skip to content

Commit b860d82

Browse files
committed
Add remove(path) and clear() for object and array builder.
1 parent cd43705 commit b860d82

File tree

2 files changed

+51
-34
lines changed

2 files changed

+51
-34
lines changed

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

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,9 +1522,15 @@ public static List<String> stringToPath(final String string) {
15221522
return result;
15231523
}
15241524

1525+
private enum OperationType {
1526+
GET,
1527+
SET,
1528+
REMOVE
1529+
}
1530+
15251531
@SuppressWarnings("unchecked")
1526-
private static <T> T baseGetAndSet(final Map<String, Object> object, final String path,
1527-
final Optional<Object> value) {
1532+
private static <T> T baseGetOrSetOrRemove(final Map<String, Object> object, final String path,
1533+
final Object value, OperationType operationType) {
15281534
final List<String> paths = stringToPath(path);
15291535
int index = 0;
15301536
final int length = paths.size();
@@ -1552,11 +1558,17 @@ private static <T> T baseGetAndSet(final Map<String, Object> object, final Strin
15521558
index += 1;
15531559
}
15541560
if (index > 0 && index == length) {
1555-
if (value.isPresent()) {
1561+
if (operationType == OperationType.SET) {
1562+
if (savedLocalObject instanceof Map) {
1563+
((Map) savedLocalObject).put(savedPath, value);
1564+
} else {
1565+
((List) savedLocalObject).set(Integer.parseInt(savedPath), value);
1566+
}
1567+
} else if (operationType == OperationType.REMOVE) {
15561568
if (savedLocalObject instanceof Map) {
1557-
((Map) savedLocalObject).put(savedPath, value.get());
1569+
((Map) savedLocalObject).remove(savedPath);
15581570
} else {
1559-
((List) savedLocalObject).set(Integer.parseInt(savedPath), value.get());
1571+
((List) savedLocalObject).remove(Integer.parseInt(savedPath));
15601572
}
15611573
}
15621574
return (T) localObject;
@@ -1569,39 +1581,15 @@ private static Map.Entry getMapEntry(Map map) {
15691581
}
15701582

15711583
public static <T> T get(final Map<String, Object> object, final String path) {
1572-
return baseGetAndSet(object, path, Optional.absent());
1584+
return baseGetOrSetOrRemove(object, path, null, OperationType.GET);
15731585
}
15741586

15751587
public static <T> T set(final Map<String, Object> object, final String path, Object value) {
1576-
return baseGetAndSet(object, path, Optional.of(value));
1588+
return baseGetOrSetOrRemove(object, path, value, OperationType.SET);
15771589
}
15781590

1579-
@SuppressWarnings("unchecked")
1580-
public static Map<String, Object> remove(final Map<String, Object> map, final String key) {
1581-
Map<String, Object> outMap = newLinkedHashMap();
1582-
for (Map.Entry<String, Object> entry : map.entrySet()) {
1583-
if (!entry.getKey().equals(key)) {
1584-
outMap.put(entry.getKey(), makeObjectForRemove(entry.getValue(), key));
1585-
}
1586-
}
1587-
return outMap;
1588-
}
1589-
1590-
@SuppressWarnings("unchecked")
1591-
private static Object makeObjectForRemove(Object value, final String key) {
1592-
final Object result;
1593-
if (value instanceof List) {
1594-
List<Object> values = newArrayList();
1595-
for (Object item : (List) value) {
1596-
values.add(item instanceof Map ? remove((Map<String, Object>) item, key) : item);
1597-
}
1598-
result = values;
1599-
} else if (value instanceof Map) {
1600-
result = remove((Map<String, Object>) value, key);
1601-
} else {
1602-
result = value;
1603-
}
1604-
return result;
1591+
public static <T> T remove(final Map<String, Object> object, final String path) {
1592+
return baseGetOrSetOrRemove(object, path, null, OperationType.REMOVE);
16051593
}
16061594

16071595
@SuppressWarnings("unchecked")
@@ -2489,6 +2477,16 @@ public Builder set(final String path, final Object value) {
24892477
return this;
24902478
}
24912479

2480+
public Builder remove(final String key) {
2481+
U.remove(data, key);
2482+
return this;
2483+
}
2484+
2485+
public Builder clear() {
2486+
data.clear();
2487+
return this;
2488+
}
2489+
24922490
public Builder add(final Builder builder) {
24932491
data.put(String.valueOf(data.size()), builder.build());
24942492
return this;
@@ -2555,6 +2553,16 @@ public ArrayBuilder set(final int index, final Object value) {
25552553
return this;
25562554
}
25572555

2556+
public ArrayBuilder remove(final int index) {
2557+
data.remove(index);
2558+
return this;
2559+
}
2560+
2561+
public ArrayBuilder clear() {
2562+
data.clear();
2563+
return this;
2564+
}
2565+
25582566
public ArrayBuilder add(final ArrayBuilder builder) {
25592567
data.addAll(builder.build());
25602568
return this;

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,9 @@ public void removeMapKey() {
631631
list.add(U.newLinkedHashMap());
632632
map2.put("list", list);
633633
U.remove(map2, "test");
634-
map2.put("list", U.newLinkedHashMap());
634+
map2.put("list2", U.newLinkedHashMap());
635635
U.remove(map2, "test");
636+
U.remove(map2, "list.0");
636637
}
637638

638639
@Test
@@ -813,6 +814,10 @@ public void objectBuilder() {
813814
builder.set("1", "3");
814815
builder.toString();
815816
assertEquals("{1=3}", builder.build().toString());
817+
builder.remove("1");
818+
assertEquals("{}", builder.build().toString());
819+
builder.clear();
820+
assertEquals("{}", builder.build().toString());
816821
Map<String, Object> value = U.objectBuilder()
817822
.add("firstName", "John")
818823
.add("lastName", "Smith")
@@ -846,6 +851,10 @@ public void arrayBuilder() {
846851
builder.set(1, "3");
847852
builder.toString();
848853
assertEquals("[1, 3, 1, 2]", builder.build().toString());
854+
builder.remove(1);
855+
assertEquals("[1, 1, 2]", builder.build().toString());
856+
builder.clear();
857+
assertEquals("[]", builder.build().toString());
849858
Map<String, Object> value = U.objectBuilder()
850859
.add("firstName", "John")
851860
.add("lastName", "Smith")

0 commit comments

Comments
 (0)