2015-10-08 3 views
1

Я хочу условно удалить коллекцию, если значение является заданным текстом, или null.Условно удалить ключ с картинки

Для простого примера ниже:

def map1 = [ 
     1: "#NULL", 
     2: [ 
       2.1: "some value", 
       2.2: "some value" 
     ]] 

assert map1.dropWhile { key, value -> 
    value.equals("#NULL") || value == null 
} == [2: [2.1: "some value", 2.2: "some value"]] 

Однако это падение, а не иметь дело с суб ключа уровня и значения. Ниже приведено одно неверное утверждение:

Есть ли способ сделать это?


Обновленный после ответа Тима Теперь ниже скрипт будет работать хорошо:

def defaultMap = [ 
     1: "some value", 
     2: [ 
       2.1: "some value", 
       2.2: "some value", 
       2.3: [ 
         "2.3.1": "some value", 
         "2.3.2": " some value" 
       ] 
     ] 
] 

def replacementMap = [2: [2.4: "some other value"]] 

assert defaultMap.collectEntries(replacementMap) { mapKey, mapValue -> 
    [mapKey, replacementMap.containsKey(mapKey) ? replacementMap[mapKey] : mapValue] // Remove default key and value pairs, if they are present in the replacement map. 
                        // New key and value pairs in the replacement map will be preserved 
}.collectEntries { mapKey, mapValue -> 
    switch (mapValue) { 
     case Map: 
      return [mapKey, { -> mapValue.collectEntries owner }()] 
     case '#NULL': // Remove key, if the value is also TEXT #NULL 
      return [:] 
     default: 
      [mapKey, mapValue] 
    } 
} == [2: [2.4: 'some other value'], 1: 'some value'] 

Однако, если я хочу, чтобы свести на нет в подкарта, но сохранить все остальные суб карты на том же уровне, не работает должным образом:

def defaultMap = [ 
     1: "some value", 
     2: [ 
       2.1: "some value", 
       2.2: "some value", 
       2.3: [ 
         "2.3.1": "some value", 
         "2.3.2": " some value" 
       ] 
     ] 
] 

def replacementMap = [2.3: '#NULL'] 

assert defaultMap.collectEntries(replacementMap) { mapKey, mapValue -> 
    [mapKey, replacementMap.containsKey(mapKey) ? replacementMap[mapKey] : mapValue] // Remove default key and value pairs, if they are present in the replacement map. 
                        // New key and value pairs in the replacement map will be preserved 
}.collectEntries { mapKey, mapValue -> 
    switch (mapValue) { 
     case Map: 
      return [mapKey, { -> mapValue.collectEntries owner }()] 
     case '#NULL': // Remove key, if the value is also TEXT #NULL 
      return [:] 
     default: 
      [mapKey, mapValue] 
    } 
} == [1:'some value', 2:[2.1:'some value', 2.2:'some value', 2.3:null]] 

ответ

1

Вы можете написать простую рекурсивную карту ходок:

def map2 = [ 
    '1': "#NULL", 
    '2': [ 
     '2.1': "#NULL", 
     '2.2': "some value" 
    ] 
] 

def result = map2.collectEntries { name, value -> 
    switch(value) { 
     case Map: 
      return [name, { -> value.collectEntries owner }()] 
     case '#NULL': 
      return [:] 
     default: 
      [name, value] 
    } 
} 

assert result == ['2':['2.2':'some value']] 
+0

Спасибо за ваш ответ Тим, большая часть из них отлично работает с одним сценарием, который я обновил в описании, можете ли вы еще раз взглянуть, есть ли у вас больше ввода? Цените свою помощь :) – nzsquall

+0

У меня такое чувство, что мой код можно упростить ..... – nzsquall

+0

Я понятия не имею, что означает ваше редактирование. Каков ожидаемый результат? –

0

Вам просто нужно использовать рекурсивный метод:

def map2 = [ 
     1: "#NULL", 
     2: [ 
       2.1: "#NULL", 
       2.2: "some value" 
     ] 
] 

def dropRecursive(Map m) { 
    m.dropWhile { k, v -> 
     if (v in Map) { 
      m[k] = dropRecursive(v) 
      return false 
     } else { 
      v == null || '#NULL'.equals(v) 
     } 
    } 
} 

assert dropRecursive(map2) == [2: [2.2: "some value"]] 

это необходимо использовать return false при обработке Map, так как результат будет проецироваться boolean выражения. Так как не пустой Map - true в groovy, он также будет удален, что нежелательно. Попробуйте поэкспериментировать с ним и без него.

Смежные вопросы