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

Javascript 如何用高阶函数解决这个问题?,javascript,node.js,arrays,Javascript,Node.js,Arrays,我需要知道如何解决我从网上读到的这个问题 对于给定的数组,我需要找到所有的uniques元素,并且小于10。然后把它们都洗干净。然后将每个数组值乘以这个数字(总和) 我假设我可以用reduce做summary,用map做乘法,但我不知道它是如何工作的,我被卡住了。要找到独特的元素也不容易 我有输入值和期望值 Input, expected [1], [1] [1, 1, 2], [2, 2, 4] [0, 0, 1, 2, 1], [0, 0, 2,

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

对于给定的数组,我需要找到所有的uniques元素,并且小于10。然后把它们都洗干净。然后将每个数组值乘以这个数字(总和)

我假设我可以用reduce做summary,用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
    }

您可以将wantes结果分为两部分,一部分用于获取唯一值的因子,另一部分用于将新值映射到因子

getSumOfUnique

factor函数迭代这些值,并继续查找不需要的值

此函数使用一个对象来计算所看到的值,并使用一个变量对唯一值求和

这有两种方式:

  • 如果以前从未见过该值,则添加该值
  • 如果该值仅显示一次,则减去该值
  • 在结束时,将调用函数的
    sum
    返回为
    factor

    乘法

    映射函数首先获取因子,并将新产品映射为

    函数getSumOfUnique(数组){ 让我们看看={}, 总和=0; for(数组的常量值){ 如果(值>=10)继续; 如果(!看到[值]){ 所见[值]=1; 总和+=数值; 继续; } 如果(见[值]==1){ 所见[值]+; 总和-=价值; } } 回报金额; } 函数乘法(数组){ 常数因子=getSumOfUnique(数组); 返回array.map(value=>value*factor); } log(…乘法([1]); log(…乘法([1,1,2]); log(…乘法([0,0,1,2,1]); log(…乘法([0,10,1,1,20,3,40,3]); log(…乘法([0,1,1,2,4,11]); log(…乘法([10,1,1,1]);
    log(…乘法([10,11,1,2,3,4])您好,欢迎来到StackOverflow

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

    试试这些例子,试着理解每一步

    您的练习需要这三个功能,因此作为概述,我们可以这样定义每一个功能(可能这是非正式的):

    • 筛选器:使用筛选器创建新数组
    • 映射:将每个值映射到数组中(即将值从一个数组映射到另一个数组)
    • Reduce:将数组缩减为唯一元素
    所以。。。谢谢你的锻炼

    这些短语本身解释了使用什么功能。选中此项:

    我需要找到所有的uniques元素和小于10的

    它的意思是:“我需要使用
    过滤器
    ,并使用类似
    return unique&&x<10
    的函数。”

    那就去游泳池吧

    所以。。。减少到一个独特的元素。类似于“然后执行
    reduce
    ,函数类似于
    returncurrentValue+nextValue

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

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

    就这些!简单,对吗?现在让我们把它翻译成代码

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

    首先,您需要使用
    过滤器

    查找唯一值和<10 唯一位置有一个技巧。如果你比较一个数字的第一个和最后一个索引,并且它是相同的值,那么…是唯一的。所以函数是这样的

    var数组=[10,11,1,2,3,4]
    var filter=array.filter(x=>(array.indexOf(x)==array.lastIndexOf(x)&&x<10))
    console.log(过滤器)/[1,2,3,4]
    
    但是没有唯一的方法可以做到这一点。你可以创建一个
    设置
    为无重复值,对每个值进行计数,得到那些
    count=1
    的值,或者其他任何值,这是你的决定。我之所以选择这个方法,是因为我认为这是最好的方法

    语法很容易理解:对于数组中名为
    x
    的每个值,然后执行
    =>
    函数。在这种情况下,比较索引和比较是
    ,因此不能将变量传递给函数

    下一步…
    reduce

    var reduce=filter.reduce((a,b)=>a+b,0)
    console.log(reduce)//10
    
    简单。使用
    减少到输出数组中。
    这里的sintaxys是:“使用当前值
    a
    和下一个值
    b
    ,执行
    =>
    函数
    a+b
    ,从
    0
    开始。换句话说……执行求和

    最后一步:
    Map

    var-map=array.map((m)=>{
    返回m*reduce
    })
    console.log(map)/[100、110、10、20、30、40]
    
    这里您是说:“对于数组中的每个值,
    m
    ,执行一个函数
    =>{…}
    ,其中乘以求和的
    m*reduce

    现在:一起做

    是的,(实际上)最后一步,只替换函数的变量

    在这里您可以看到
    reduce
    put
    filter.reduce((a,b)=>a+b,0)

    如果有
    filter
    set
    array.filter(x=>(array.indexOf(x)==array.lastIndexOf(x)和&x<10))

    var-map=array.map((m)=>{
    返回m*(array.filter(x=>(array.indexOf(x)==array.lastIndexOf(x)&&x<10))。减少
    
    const array = [10, 11, 3, 20, 5];
    const lesserThanTen = array.filter(element => element < 10);
    console.log(lesserThanTen) //[3, 5]
    
    function myFunc(total, num) {
      return total + num; // this will return the sum of the two numbers it receives
    } 
    // The reduce() method applies this to the array until it is just a single value
    
    var reducedNumbers = lesserThanTen.reduce(myFunc);
    
    var x = lesserThanTen.map(multiplyBySummatory)