Arrays Swit中的函数式编程,用于分配数组元素以更正;“桶”;
我不熟悉函数式编程。我的问题是我有一个主数组和一个固定数量的“目标”数组。我想根据每个元素的特定值,将主数组中的元素分配到正确的结果数组中 我猜一种方法是使用一个map函数,它遍历主数组元素,确定正确的“目标数组”值(基于某些逻辑),然后将元素添加到该数组中。然而,我不确定这是不是很好。毕竟,更改映射到的主数组外部的数组会产生副作用Arrays Swit中的函数式编程,用于分配数组元素以更正;“桶”;,arrays,swift,functional-programming,higher-order-functions,Arrays,Swift,Functional Programming,Higher Order Functions,我不熟悉函数式编程。我的问题是我有一个主数组和一个固定数量的“目标”数组。我想根据每个元素的特定值,将主数组中的元素分配到正确的结果数组中 我猜一种方法是使用一个map函数,它遍历主数组元素,确定正确的“目标数组”值(基于某些逻辑),然后将元素添加到该数组中。然而,我不确定这是不是很好。毕竟,更改映射到的主数组外部的数组会产生副作用 在FP中如何正确地做到这一点?我的想法是:您可以使用reduce来消除副作用。与其先创建数组,不如创建一个数组字典 例如,下面是一个扩展,允许您通过应用函数对原始数
在FP中如何正确地做到这一点?我的想法是:您可以使用
reduce
来消除副作用。与其先创建数组,不如创建一个数组字典
例如,下面是一个扩展,允许您通过应用函数对原始数组的元素进行分组:
extension Array {
func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] {
return self.reduce([T: [Element]]()) { (var aggregate, element) in
let key = f(element)
if aggregate[key] != nil {
aggregate[key]!.append(element)
} else {
aggregate[key] = [element]
}
return aggregate
}
}
}
示例2:按长度对字符串分组
let arr1 = ["lorem", "ipsum", "dolor", "sit", "amet"]
let arr2 = arr1.groupBy {
$0.characters.count
}
很酷!我喜欢你不只是简单地为我原来的问题提供了一个解决方案,而是稍微改变了问题本身,使解决方案更加优雅。@Daniel谢谢。我的大部分函数经验来自Mathematica。这是一个很棒的工具。这几天我什么都没用。
let arr1 = ["lorem", "ipsum", "dolor", "sit", "amet"]
let arr2 = arr1.groupBy {
$0.characters.count
}