Javascript 比较两个数组并使用Ramda查找相等的值
我最近爱上了函数式编程,并开始学习ramda.js,但我似乎还不能进入函数式思维。我有两个字符串数组(它们实际上是拆分的字符串),我想知道第一个字符串中有多少个字符与第二个字符串中相同位置的字符相等。 我必须做一些非常简单的事情,大致如下:Javascript 比较两个数组并使用Ramda查找相等的值,javascript,node.js,functional-programming,Javascript,Node.js,Functional Programming,我最近爱上了函数式编程,并开始学习ramda.js,但我似乎还不能进入函数式思维。我有两个字符串数组(它们实际上是拆分的字符串),我想知道第一个字符串中有多少个字符与第二个字符串中相同位置的字符相等。 我必须做一些非常简单的事情,大致如下: let counter = 0 for(let i = 0; i < array.length; i++){ if(firstArray[i] === secondArray[i]) counter++ } let计数器=0 for(设i=0;i
let counter = 0
for(let i = 0; i < array.length; i++){
if(firstArray[i] === secondArray[i]) counter++
}
let计数器=0
for(设i=0;i
但是我用ramda怎么做呢
“…使用rambda”
这里有一种方法你可以做到这一点-有无数其他的方法
const countEqualChars = (a, b) =>
R.sum(R.zipWith(R.equals, a, b))
countEqualChars(
[ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ],
[ 'a', 'b', 'c', 'x', 'y', 'z', 'g' ]
)
// 4
countEqualChars('abcdefg', 'abcxyzg')
// 4
但是…
这基本上是一种错误的函数式编程方法。忘记Rambda吧,直到你对如何以功能性的方式对程序进行推理有了很好的认识。如果你不知道事情在一个基本的层面上是如何运作的,你将永远无法欣赏到Rambda的便利性
首先学习递归作为for/while
循环的替代方法。循环没有什么错,但递归有时会让你以更好的方式表达事物
常数a=
“abcdefg”
常数b=
‘abcxyzg’
常数countEqualChars=([x,…xs],[y,…ys])=>
{if(x==未定义| | y==未定义)
返回0
else如果(x==y)
返回1+countEqualChars(xs,ys)
其他的
返回计数相等(xs,ys)
}
console.log(countEqualChars(a,b))
//4
“…使用rambda”
这里有一种方法你可以做到这一点-有无数其他的方法
const countEqualChars = (a, b) =>
R.sum(R.zipWith(R.equals, a, b))
countEqualChars(
[ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ],
[ 'a', 'b', 'c', 'x', 'y', 'z', 'g' ]
)
// 4
countEqualChars('abcdefg', 'abcxyzg')
// 4
但是…
这基本上是一种错误的函数式编程方法。忘记Rambda吧,直到你对如何以功能性的方式对程序进行推理有了很好的认识。如果你不知道事情在一个基本的层面上是如何运作的,你将永远无法欣赏到Rambda的便利性
首先学习递归作为for/while
循环的替代方法。循环没有什么错,但递归有时会让你以更好的方式表达事物
常数a=
“abcdefg”
常数b=
‘abcxyzg’
常数countEqualChars=([x,…xs],[y,…ys])=>
{if(x==未定义| | y==未定义)
返回0
else如果(x==y)
返回1+countEqualChars(xs,ys)
其他的
返回计数相等(xs,ys)
}
console.log(countEqualChars(a,b))
//4
我无法与另一个优秀的答案竞争,但别忘了阵列
原型有许多有用的方法,例如过滤
或减少
var countMatches=(a,b)=>a.reduce((sum,c,i)=>
b[i]==c
?++和
:sum
, 0);
var set1=“1234678”。拆分(“”);
var set2=“1234568”。拆分(“”);
log(countMatches(set1,set2))
我无法与另一个优秀的答案竞争,但别忘了阵列
原型有许多有用的方法,如过滤
或减少
var countMatches=(a,b)=>a.reduce((sum,c,i)=>
b[i]==c
?++和
:sum
, 0);
var set1=“1234678”。拆分(“”);
var set2=“1234568”。拆分(“”);
log(countMatches(set1,set2))代码>如果您只是想看看这两个数组有哪些相同的元素,那么您可能想看看
R.交点([1,2,3,4],[7,6,5,4,3]);//=>[4,3]
如果您只是想看看这两个数组有哪些共同元素,那么您可能想看看
R.交点([1,2,3,4],[7,6,5,4,3]);//=>[4,3]
我不希望有一个更完整、更深思熟虑的答案。非常感谢^^。我真希望得到一个更完整、更深思熟虑的答案。非常感谢^^。reduce
的实用性很好–我唯一的建议是返回sum+1
而不是sum++
,因为数字已经是不可变的了。我没有想到用这种方式。我已经使用标准的map/reduce/filter数组方法很长一段时间了,但是很多时候里面的函数变得非常大,我不喜欢使用params列表中的索引。很好的解决方案,reduce
的实际应用很好–我唯一的建议是返回sum+1
而不是sum++
,因为数字已经是不可变的了。我没有想到用那种方式。我已经使用标准的map/reduce/filter数组方法很长一段时间了,但是很多时候里面的函数变得非常大,我不喜欢使用params列表中的索引。很好的解决方案,虽然这不起作用,因为OP希望角色在同一位置上是相同的。这意味着本例中的正确答案应该是[4]
,因为3
在两个列表中不在同一位置。这不起作用,因为OP希望字符在同一位置相同。这意味着在这种情况下正确的答案只能是[4]
,因为3
在两个列表中不在同一位置。