如何用高阶函数解决这个问题?

VD Lester

我需要知道如何解决我从互联网上读到的这个问题。

对于给定的数组,我需要找到所有的uniques元素并减去10。然后对所有元素进行求和。然后,将每个数组值乘以该数字(求和)。

我假设我可以使用reduce来进行求和,然后使用map进行乘法运算,但是我真的不知道它是如何工作的,所以我陷入了困境。另外要找到独特的元素也不容易。

我有输入值和预期值。

    Input, expected  
    [1], [1]  
    [1, 1, 2], [2, 2, 4]  
    [0, 0, 1, 2, 1], [0, 0, 2, 4, 2]  
    [0, 10, 1, 1, 20, 3, 40, 3], [0, 0, 0, 0, 0, 0, 0, 0]  
    [0, 1, 1, 2, 4, 11], [0, 6, 6, 12, 24, 66]  
    [10, 1, 1, 1], [0, 0, 0, 0]  
    [10, 11, 1, 2, 3, 4], [100, 110, 10, 20, 30, 40]

我正在尝试一些事情,但主要问题是我不了解语法。我知道如何通过循环解决此迭代,但是我想学习高阶函数。

这不是学校的项目,我正在学习这一点,所以我不需要解决方案,我想了解,谢谢。

我试过的是这样应用地图。并过滤和减少

    var input = [0, 0, 1, 2, 1]
    var output = [0, 0, 2, 4, 2]

    var map, reduce, filter;
    map = input.map(multiplyFunction(first,second))

    function multiplyFunction(first,second){
        return first*second
    }
JF

您好,欢迎来到StackOverflow。

首先,我认为开始了解语法的一个好方法是检查w3示例:filtermapreduce或mozilla示例:filtermapreduce

尝试这些示例,并尝试理解每个步骤。

您的锻炼需要这三个功能,因此,作为概述,我们可以以这种方式定义每个功能(也许是非正式的):

  • 过滤器:使用过滤器创建一个新数组。
  • 映射:将每个值都放入数组中(例如,将值从一个数组映射到另一个)。
  • 精简:数组精简为唯一元素。

所以...为您的运动。

这些短语本身说明了要使用的功能。检查一下:

我需要找到所有唯一性元素,并且减去10

这意味着:“我需要使用filter类似的功能return unique && x < 10。”

然后做总结

所以...归结为一个独特的元素。就像“然后reducereturn currentValue + nextValue

然后将每个数组值乘以该数字

就像这样:“然后将每个值映射为value*=sumatory

就这样!容易吧?现在让我们翻译成代码。

假设您有一个这样的数组:([10, 11, 1, 2, 3, 4]示例的最后一个)

首先,您需要找到唯一值,并使用<10 filter
独特的位置是有技巧的。如果比较一个数字的第一个索引和最后一个索引,并且它的值相同,则...是唯一的。所以功能是这样的

var array = [10, 11, 1, 2, 3, 4]
var filter = array.filter(x => (array.indexOf(x) === array.lastIndexOf(x) && x < 10))
console.log(filter) // [ 1, 2, 3, 4 ] 

但是,不仅只有一种方法可以做到这一点。您可以创建一个Set没有重复的值,计算每个值以获取具有count=1或不带有任何值的值,这是您的决定。我选择这个是因为我认为这是最好的方法。

语法很容易理解:对于数组中的每个值,命名x后执行=>函数即可。在这种情况下,比较索引,比较为<10

请注意,在您的示例中,您不见了,(x) =>因此您无法将变量传递给函数。

下一步... reduce

var reduce = filter.reduce((a, b) => a + b, 0)
console.log(reduce) // 10

简单。使用reduce到输出数组中。
这里的sintaxys是:“使用当前值a和下一个值b,执行开始=>的功能换句话说...做总结。a+b0

最后一步:Map

var map = array.map((m) => {
    return m * reduce
})
console.log(map) // [ 100, 110, 10, 20, 30, 40 ]

在这里,您说的是:“对于数组中的每个值m,执行一个函数=>{...},将其乘以求和m * reduce。”

现在:一起做!!

是的,(真的)最后一步,仅替换函数的变量。

如果您看到reducefilter.reduce((a, b) => a + b, 0)
在哪里filter设置array.filter(x => (array.indexOf(x) === array.lastIndexOf(x) && x < 10))

var map = array.map((m) => {
    return m * (array.filter(x => (array.indexOf(x) === array.lastIndexOf(x) && x < 10))).reduce((a, b) => a + b, 0)
})

就这样。

希望可以帮助您了解如何使用这些功能以及如何解决这些问题。

看完您尝试过的内容后,请查看示例,并注意需要使用获取变量(var) =>

还有一个片段

var array = [10, 11, 1, 2, 3, 4]
var map = array.map((m) => {
    return m * (array.filter(x => (array.indexOf(x) === array.lastIndexOf(x) && x < 10))).reduce((a, b) => a + b, 0)
})
console.log(map)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章