Swift中使用map遍历嵌套数组并获取元素及索引的方法
Swift嵌套数组遍历与map的正确用法
你当前的代码问题在于,第一个map只是原样返回每个子数组,所以后续的map依然在遍历子数组而非单个元素。要实现遍历嵌套数组的每个元素并打印索引,可按以下方式处理:
1. 仅获取所有单个元素(忽略所属子数组)
如果不需要关心元素属于哪个子数组,用flatMap可以直接将嵌套数组展平为一维数组,再遍历打印:
var raceResults = [["one","two","four"],["two","one","five","six"],["two","one","four","ten"],["one","two","four"]] raceResults.flatMap { $0 }.forEach { print($0) }
flatMap会把每个子数组的元素依次取出,合并成一个新的一维数组,后续的forEach就能逐个访问单个元素。
2. 打印元素及其在子数组中的索引(含子数组自身索引)
如果需要同时知道元素属于哪个子数组,以及它在该子数组中的位置,结合enumerated()和链式调用即可:
raceResults.enumerated() .flatMap { groupIndex, group in // 给每个元素绑定子数组索引和自身索引 group.enumerated().map { elementIndex, element in (groupIndex: groupIndex, elementIndex: elementIndex, value: element) } } .forEach { item in print("子数组[\(item.groupIndex)] 元素索引[\(item.elementIndex)]:\(item.value)") }
这里先用enumerated()获取每个子数组的索引(groupIndex),再对每个子数组用enumerated()获取内部元素的索引,将这些信息包装成元组后用flatMap展平,最后遍历打印所有元组信息。
注意:map vs forEach
你的代码里用map来执行打印操作其实不符合语义——map的核心是转换数组元素,而打印是副作用操作,更适合用forEach。如果只是为了遍历执行打印,直接用嵌套forEach更简洁:
raceResults.enumerated().forEach { groupIndex, group in group.enumerated().forEach { elementIndex, element in print("子数组[\(groupIndex)] 元素索引[\(elementIndex)]:\(element)") } }
内容的提问来源于stack exchange,提问作者user1845926
相关产品推荐
相关产品推荐

