Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swit中的函数式编程,用于分配数组元素以更正;“桶”;_Arrays_Swift_Functional Programming_Higher Order Functions - Fatal编程技术网

Arrays Swit中的函数式编程,用于分配数组元素以更正;“桶”;

Arrays Swit中的函数式编程,用于分配数组元素以更正;“桶”;,arrays,swift,functional-programming,higher-order-functions,Arrays,Swift,Functional Programming,Higher Order Functions,我不熟悉函数式编程。我的问题是我有一个主数组和一个固定数量的“目标”数组。我想根据每个元素的特定值,将主数组中的元素分配到正确的结果数组中 我猜一种方法是使用一个map函数,它遍历主数组元素,确定正确的“目标数组”值(基于某些逻辑),然后将元素添加到该数组中。然而,我不确定这是不是很好。毕竟,更改映射到的主数组外部的数组会产生副作用 在FP中如何正确地做到这一点?我的想法是:您可以使用reduce来消除副作用。与其先创建数组,不如创建一个数组字典 例如,下面是一个扩展,允许您通过应用函数对原始数

我不熟悉函数式编程。我的问题是我有一个主数组和一个固定数量的“目标”数组。我想根据每个元素的特定值,将主数组中的元素分配到正确的结果数组中

我猜一种方法是使用一个map函数,它遍历主数组元素,确定正确的“目标数组”值(基于某些逻辑),然后将元素添加到该数组中。然而,我不确定这是不是很好。毕竟,更改映射到的主数组外部的数组会产生副作用


在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
}