Как сравнить массив словарей? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть массив словарей, ключи которых могут меняться в зависимости от входящих данных. Например,

arrayOfDict = [["default": "Accessibility", "cn": "为每个人而设计"], 
               ["br": "Acessibilidade", "hk_cn": "輔助使用", "default": "Accessibility"], 
               ["hk_cn": "輔助", "default": "Accessibility", "pl": "Ułatwienia dostępu"]]

  1. Я хочу l oop через каждый из словарей, чтобы определить, имеет ли какой-либо ключ несколько значений, и отобразить эти несколько значений для пользователя, а затем позволить пользователь выбирает одно из значений, остальные значения должны быть удалены. (Например, в приведенном выше массиве "hk_cn" имеет два разных значения)

  2. И если несколько значений одинаковы, I хотите удалить один из ключей. (Например: по умолчанию везде одинаковое значение)

Итак, наконец, у меня должен быть единственный словарь из arrayOfDict. Итак, окончательный результат должен быть таким: если пользователь выбрал первое значение "hk_cn".

["default": "Accessibility", "cn": "为每个人而设计","hk_cn": "輔助使用", "br": "Acessibilidade", "pl": "Ułatwienia dostępu" ]

1 Ответ

0 голосов
/ 09 июля 2020

1. Выровняйте arrayOfDict, чтобы получить одиночный Dictionary, используя flatMap(_:)

let combinedDict = arrayOfDict.flatMap{($0)}

2. Сгруппируйте элемент combinedDict на основе key, используя init(grouping:by:)

let groupedDict = Dictionary(grouping: combinedDict) { $0.key }

3. Получите formattedDict используя mapValues(_:)

let formattedDict = groupedDict.mapValues { Array(Set($0.map { $0.value })) }

formattedDict Вывод:

["pl": ["Ułatwienia dostępu"], "cn": ["为每个人而设计"], "br": ["Acessibilidade"], "default": ["Accessibility"], "hk_cn": ["輔助使用", "輔助"]] 

Теперь вы можете запросить пользователя, используя formattedDict, и спросить, какое значение сохранить для соответствующих ключей.

Изменить:

Согласно вашему комментарию, вы можете использовать allSatisfy(_:) на formattedDict, чтобы проверить, он содержит одиночный value для каждого key.

let formattedDict = groupedDict.mapValues { Set($0.map { $0.value }) }
if formattedDict.values.allSatisfy({ $0.count == 1 }) {
    let newformattedDict = formattedDict.compactMapValues { $0.first }
} else {
    //add your code to display data in table here...
}
...