例如,我需要从JSON example获取“ex”范围的所有英文“text”值 我做了什么:
let result = json["def"].arrayValue.map({ $0["tr"].arrayValue.map { $0["ex"] } })
但结果我得到了一个双重大量,如果我打算得到所有“文本”,那么我将得到一个三重数组。猜猜应该是另一个更优雅的方法来完成这项任务。有人能展示出一个非常好的解决方案吗?
答案 0 :(得分:0)
如果你的表达式提供3个字符串数组,你可以在末尾添加.reduce([], +)
以将3个数组加入
之一。
我是从记忆中打字,并说错了。你会使用reduce,而不是加入。
let result = json["def"]
.arrayValue
.map({ $0["tr"].arrayValue.map { $0["ex"] } })
.reduce([], +)
那可以给你你想要的东西。
reduce函数对序列(如数组)进行操作。它需要一个"初始结果"为进程设置种子的值,然后是对2个元素进行操作的闭包,并返回结果。 (a"二进制"关闭)
+
运算符实际上是Swift中的二进制闭包。它需要2个元素并返回一个结果,因此您只需传入+
而不是闭包。对于数组,+
返回组合数组的结果。
因此,当您对数组数组使用reduce()并将[]
作为初始结果时,它会将[]
与第一个数组合并,然后是每个+
运算符的结果与数组中的下一个条目。
以此简化代码为例:
//Start with an array of arrays of strings
let arrays = [
["string1", "string2", "string3"],
["string4", "string5", "string6"],
["string7", "string8", "string9"]
]
//First loop through the outer arrays and log their contents
for (index, object) in arrays.enumerated() {
print("array[\(index)] = \(object)")
}
//Now combine the outer arrays into a single array
let combined = arrays.reduce([], + )
//Now print the entries in the combined array
print("\n---- combined arrays ----")
for (index, object) in combined.enumerated() {
print("array[\(index)] = \(object)")
}
产生以下输出:
array[0] = ["string1", "string2", "string3"]
array[1] = ["string4", "string5", "string6"]
array[2] = ["string7", "string8", "string9"]
---- combined arrays ----
array[0] = string1
array[1] = string2
array[2] = string3
array[3] = string4
array[4] = string5
array[5] = string6
array[6] = string7
array[7] = string8
array[8] = string9