如何在Javascript函数式编程中实现简单计数器?
我正在重新编写代码以更好地适应函数式编程,我无法找到一个没有变异的简单计数器的好解决方案如何在Javascript函数式编程中实现简单计数器?,javascript,functional-programming,counter,Javascript,Functional Programming,Counter,我正在重新编写代码以更好地适应函数式编程,我无法找到一个没有变异的简单计数器的好解决方案 const countRows = (element) => (obj) => { var count = 0; Object.entries(obj).forEach(([key,value]) => { if (value.nodeName == element) { count = count + 1; }; }); return count;
const countRows = (element) => (obj) => {
var count = 0;
Object.entries(obj).forEach(([key,value]) => {
if (value.nodeName == element) {
count = count + 1;
};
});
return count;
};
我一直在尝试使用辅助函数和递归来解决这个问题,但除非我使用某种类型的变异,否则一切似乎都不会成功。我觉得这是一件非常简单的事情,但我就是不知道这是怎么回事。至少我在函数中包含了变异,而不是全局变量 这应该行得通
Object.keys(obj).filter(key=>obj[key].nodeName == element).length
这应该行得通
Object.keys(obj).filter(key=>obj[key].nodeName == element).length
我一直在尝试使用helper函数和递归来解决这个问题
我想给你一个递归的解决方案,即使已经给了你一个很好的解决方案
台阶
- 检查对象是否有条目
- 对象有条目,检查对象值是否等于x
- 删除第一个对象条目并递增计数器
- 否则仅删除第一个对象条目
- 对象有条目,检查对象值是否等于x
- 否则返回默认为
0
常量isEqualObjectValue=([key,value],x)=>
值===x
const countRows=(objectEntries,x,counter=0)=>{
如果(objectEntries.length>0){
if(isEqualObjectValue(objectEntries[0],x)){
返回countRows(objectEntries.slice(1),x,计数器+1)
}否则{
返回countRows(objectEntries.slice(1),x,counter)
}
}否则{
返回计数器
}
}
常数测试={
a:':o',
b:‘x’,
c:':o',
d:':o',
e:'x'
}
console.log('您能找到多少\':o\'),countRows(Object.entries(test),':o'))
我一直在尝试使用helper函数和递归来解决这个问题
我想给你一个递归的解决方案,即使已经给了你一个很好的解决方案
台阶
- 检查对象是否有条目
- 对象有条目,检查对象值是否等于x
- 删除第一个对象条目并递增计数器
- 否则仅删除第一个对象条目
- 对象有条目,检查对象值是否等于x
- 否则返回默认为
0
常量isEqualObjectValue=([key,value],x)=>
值===x
const countRows=(objectEntries,x,counter=0)=>{
如果(objectEntries.length>0){
if(isEqualObjectValue(objectEntries[0],x)){
返回countRows(objectEntries.slice(1),x,计数器+1)
}否则{
返回countRows(objectEntries.slice(1),x,counter)
}
}否则{
返回计数器
}
}
常数测试={
a:':o',
b:‘x’,
c:':o',
d:':o',
e:'x'
}
console.log('您能找到多少\':o\'),countRows(Object.entries(test),':o')
接受的解决方案将创建一个macthes数组,其唯一目的是对元素进行计数。在不发生额外分配的情况下,您可以轻松制作计数版本的筛选器:
函数countIf(coll、谓词、上下文){
return coll.reduce((matches,value)=>predicate.call(context,value)?matches+1:matches,0);
}
它与高阶函数的下划线行和
它甚至可以用于主干集合。下面是我应该实现的HWcountRows
:
const countRows=(元素)=>(对象)=>
伯爵(
对象键(obj),
value=>obj[value].nodeName==element);
接受的解决方案将制作一个macthes阵列,仅用于计算元素。在不发生额外分配的情况下,您可以轻松制作计数版本的筛选器:
函数countIf(coll、谓词、上下文){
return coll.reduce((matches,value)=>predicate.call(context,value)?matches+1:matches,0);
}
它与高阶函数的下划线行和
它甚至可以用于主干集合。下面是我应该实现的HWcountRows
:
const countRows=(元素)=>(对象)=>
伯爵(
对象键(obj),
value=>obj[value].nodeName==element);
这是一个快速的答案,而且效果非常好。让我问你这个问题,函数式编程中有计数器吗?或者你只需要想一个不同的方法来解决问题,就像你刚才做的那样?太好了。如果我们有一些特定的条件,我们需要考虑一个,因为我们没有计算所有的元素或查找相同的结构。filter、reduce、forEach和map方法提供了不同的简化方法。这是一个快速的答案,而且效果非常好。让我问你这个问题,函数式编程中有计数器吗?或者你只需要想一个不同的方法来解决问题,就像你刚才做的那样?太好了。如果我们有一些特定的条件,我们需要考虑一个,因为我们没有计算所有的元素或查找相同的结构。filter、reduce、forEach和map方法提供了不同的简化方法。