如何比较字典数组?
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"]]
我想遍历每个字典以查找是否有任何键具有多个值并将多个值显示给用户然后让用户选择一个值,其余值必须被删除。(例如在上面的数组中“hk_cn”有两个不同的值)
如果多个值相同,我想删除其中一个键。 (例如:默认值在任何地方都相同)
最后,我应该有一个来自 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...
}
我有一组字典,其键值可能会根据传入数据而有所不同。例如,
arrayOfDict = [["default": "Accessibility", "cn": "为每个人而设计"],
["br": "Acessibilidade", "hk_cn": "輔助使用", "default": "Accessibility"],
["hk_cn": "輔助", "default": "Accessibility", "pl": "Ułatwienia dostępu"]]
我想遍历每个字典以查找是否有任何键具有多个值并将多个值显示给用户然后让用户选择一个值,其余值必须被删除。(例如在上面的数组中“hk_cn”有两个不同的值)
如果多个值相同,我想删除其中一个键。 (例如:默认值在任何地方都相同)
最后,我应该有一个来自 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...
}