Javascript 如何用高阶函数解决这个问题?
我需要知道如何解决我从网上读到的这个问题 对于给定的数组,我需要找到所有的uniques元素,并且小于10。然后把它们都洗干净。然后将每个数组值乘以这个数字(总和) 我假设我可以用reduce做summary,用map做乘法,但我不知道它是如何工作的,我被卡住了。要找到独特的元素也不容易 我有输入值和期望值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,
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:将数组缩减为唯一元素
过滤器
,并使用类似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
putfilter.reduce((a,b)=>a+b,0)
如果有filter
setarray.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)