如何使用映射和过滤器从一维数组生成二维数组?

Die*_*ach 3 arrays multidimensional-array higher-order-functions ios swift

我今天使用循环获得了所需的输出,但是如何使用 map 和 filter 将该循环与单行表达式交换?

我从一系列国家开始。从这个我使用 map 生成带有首字母的第二个数组。我现在想构建一个二维数组,其中包含使用 map 和 filter 在不同数组中具有相同首字母的所有国家,以便我可以摆脱我今天使用的循环。

let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]

var initials = Set(countries.map { $0.prefix(1) }).sorted()

func countriesByInitial() -> [[String]] {
    var result = [[String]]()
    for initial in initials {
        result.append(countries.filter { $0.prefix(1) == initial })
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)

Ank*_*wal 5

您可以通过group > sort > map组合来实现它:

let countries = ["Algeria", "Albania", "Belarus", "Bahamas", "Canada"]
let groupedDict = Dictionary(grouping: countries, by: { $0.prefix(1) })
let sortedDict = groupedDict.sorted(by: { $0.key < $1.key })
let arr2D = sortedDict.map({ $0.value })
Run Code Online (Sandbox Code Playgroud)

您可以将其写在一行中:

let arr = (Dictionary(grouping: countries, by: { $0.prefix(1) })).sorted(by: { $0.key < $1.key }).map({ $0.value })
Run Code Online (Sandbox Code Playgroud)

您也可以在数组上使用 reduce:

// $0 将是类型 [[String]]

// $1 将是类型 String

let arr2D: [[String]] = countries.reduce(into: []) {
    let checkChar = $1.first
    if let idx = $0.index(where: {$0.first?.first == checkChar }) {
        $0[idx].append($1)
    } else {
        $0.append([$1])
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `arr2D` 是一个数组。你需要什么输出? (2认同)
  • 感谢您指出@MartinR,我忘记更改我在操场上尝试的变量名。现在更新答案。 (2认同)