将数组划分为子数组



我有以下数组,我必须确保以这种方式将其划分为子数组,并将名称的第一部分后跟/作为细分的标准,例如"名称/其他";。

你能帮我一把吗?

var a = ["origin/a", "origin/b", "origin/c", "remo/a", "remo/d", "remo/c", "next/g"]
var b = {
origin: ["a", "b", "c"], 
remo: ["a", "d", "c"], 
next: ["g"]
}

您可以使用reduce(into:_:)来执行此操作:

let reduced = a.reduce(into: [String: [String]]()) { partialResult, currentTerm in
let components = currentTerm.components(separatedBy: "/")
guard components.count == 2 else { return }
partialResult[components[0]] = partialResult[components[0], default: [String]()] + [components[1]]
}
print(reduced)

输出:

$>["remo": ["a", "d", "c"], "next": ["g"], "origin": ["a", "b", "c"]]

一个想法是这样的:

首先,我们需要将字典的关键字和所有需要收集在一起的值分开:

let keysValues = a
.map { $0.components(separatedBy: "/") }
.compactMap { components -> (String, String)? in
guard components.count == 2 else { return nil }
return (components.first!, components.last!)
}

现在,我们需要通过将每个键的值分组在一起,将其简化为[String: [String]]的字典:

var dict: [String: [String]] = [:]
let answer = keysValues.reduce(into: dict) { (d, kv) in
let (k, v) = kv
d[k, default: []] += [v]
}

最新更新