使用map快速迭代数组的数组

问题描述 投票:0回答:2

我试图理解 swift 中地图函数的概念。我想以这样的方式迭代数组的数组,以便可以打印每个数组中的每个元素及其索引。 下面是我的代码

var raceResults = [["one","two","four"],["two","one","five","six"],["two","one","four","ten"],["one","two","four"]]

   raceResults.map {
        return $0 // Returns first array 
    }.map { 
        print($0) // was expecting each element in first array here but it's whole array 
    }

我想知道如何使用链接来控制数组中的每个元素?

swift maps reduce
2个回答
1
投票

让我们从单个数组开始,例如:

let raceResult = ["one", "two", "four"]

如果我们想将每个元素与从

0
开始计数的偏移量组合起来,我们可以使用
Array.enumerated()
以及
map

let numberedRaceResult = raceResult
    .enumerated()
    .map { offset, element in "\(offset). \(element)" }

for numberedResult in numberedRaceResult {
    print(numberedResult)
}

// Prints:
// 0. one
// 1. two
// 2. four

您可以看到我没有在传递给

print
的闭包内调用
map
。你可以这样做,但是它有点违背了
map
的目的(即从输入数组的转换元素创建一个大小相等的输出数组),因为结果将不会被使用。在这种情况下,仅使用
for
循环或调用
forEach
更有意义,如 @Sh_Khan 所示。

处理嵌套数组,情况大致相同。我们可以使用与一个数组相同的逻辑,但将其应用于每个子数组。

let raceResults = [
    ["one", "two", "four"],
    ["two", "one", "five", "six"],
    ["two", "one", "four", "ten"],
    ["one", "two", "four"],
]

let numberedRaceResults = raceResults
    .enumerated()
    .flatMap { outterOffset, raceResult in
        raceResult
            .enumerated()
            .map { innerOffset, element in "\(outterOffset).\(innerOffset). \(element)" }
    }

for numberedResult in numberedRaceResults {
    print(numberedResult)
}

// Prints:
// 0.0. one
// 0.1. two
// 0.2. four
// 1.0. two
// 1.1. one
// 1.2. five
// 1.3. six
// 2.0. two
// 2.1. one
// 2.2. four
// 2.3. ten
// 3.0. one
// 3.1. two
// 3.2. four

您会注意到我在外部数组上使用了

flatMap
,而不是简单的
map
。您可以来回更改并比较结果。简而言之,
flatMap
为您提供字符串结果的单个平面数组,而不是字符串子数组的数组。


0
投票

Map 用于将一堆类型 T 转换为其他类型 X。就像将这些 Int 映射到 String 一样。 您不应该使用地图来产生副作用,例如打印值或更新数据库等。它应该是一个接受输入并返回输出的纯函数。 “将这些 A 映射到 B”。纯粹的意思是函数的值仅取决于输入,与世界的当前状态无关,也不会改变世界(如打印到控制台),因此例如,通过函数映射这些 int给它们加 2。

在你的例子中:

var raceResults = [["one","two","four"],["two","one","five","six"],["two","one","four","ten"],["one","two","four"]]

你有一个“字符串数组”的数组。

你可以将其映射到一个数组,只要你有一个函数可以接受“字符串数组”并将其转换为“其他东西”

在这里,您将其与 Identity 函数 进行映射,该函数仅返回其输入,该函数将接受一个字符串数组作为输入,并返回与输出完全相同的字符串数组:

   raceResults.map {
       return $0 // Returns first array 
   }

这不会执行任何操作,结果与 raceResults 完全相同。

如果你想迭代所有这些元素,那么函数 flatMap 很方便:

raceResults.flatMap { $0 }.forEach { print($0) }

flatMap
被压平,然后贴图。展平数组的数组就是返回一个数组,其中所有内容都“展平”了一级,因此 [[1, 2, 3], [4, 5, 6]] -> [1, 2, 3, 4, 5 , 6],但展平含义的定义取决于容器的类型,例如,Optional 上的 flatMap 与 Array 上的 flatMap 表示其他含义。

© www.soinside.com 2019 - 2024. All rights reserved.