如何比较字典数组?

How to compare array of dictionaries?

我有一组字典,其键值可能会根据传入数据而有所不同。例如,

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

  1. 我想遍历每个字典以查找是否有任何键具有多个值并将多个值显示给用户然后让用户选择一个值,其余值必须被删除。(例如在上面的数组中“hk_cn”有两个不同的值)

  2. 如果多个值相同,我想删除其中一个键。 (例如:默认值在任何地方都相同)

最后,我应该有一个来自 arrayOfDict 的字典。 所以最终结果应该是:如果用户首先选择了“hk_cn”值。

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

1. 使用 flatMap(_:)arrayOfDict 展平以获得单个 Dictionary

let combinedDict = arrayOfDict.flatMap{([=10=])}

2. 根据 key 使用 init(grouping:by:)[ 对 combinedDict 元素进行分组=29=]

let groupedDict = Dictionary(grouping: combinedDict) { [=11=].key }

3. 使用 mapValues(_:)

获取 formattedDict
let formattedDict = groupedDict.mapValues { Array(Set([=12=].map { [=12=].value })) }

formattedDict 输出:

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

现在您可以使用 formattedDict 提示用户并询问为相应的键保留哪个值。

编辑:

根据您的评论,您可以在 formattedDict 上使用 allSatisfy(_:) 检查每个 [=19] 是否包含单个 value =].

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