如何在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
      • 删除第一个对象条目并递增计数器
      • 否则仅删除第一个对象条目
  • 否则返回默认为
    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
      • 删除第一个对象条目并递增计数器
      • 否则仅删除第一个对象条目
  • 否则返回默认为
    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);
}
它与高阶函数的下划线行和 它甚至可以用于主干集合。下面是我应该实现的HW
countRows

const countRows=(元素)=>(对象)=>
伯爵(
对象键(obj),
value=>obj[value].nodeName==element);

接受的解决方案将制作一个macthes阵列,仅用于计算元素。在不发生额外分配的情况下,您可以轻松制作计数版本的筛选器:

函数countIf(coll、谓词、上下文){
return coll.reduce((matches,value)=>predicate.call(context,value)?matches+1:matches,0);
}
它与高阶函数的下划线行和 它甚至可以用于主干集合。下面是我应该实现的HW
countRows

const countRows=(元素)=>(对象)=>
伯爵(
对象键(obj),
value=>obj[value].nodeName==element);

这是一个快速的答案,而且效果非常好。让我问你这个问题,函数式编程中有计数器吗?或者你只需要想一个不同的方法来解决问题,就像你刚才做的那样?太好了。如果我们有一些特定的条件,我们需要考虑一个,因为我们没有计算所有的元素或查找相同的结构。filter、reduce、forEach和map方法提供了不同的简化方法。这是一个快速的答案,而且效果非常好。让我问你这个问题,函数式编程中有计数器吗?或者你只需要想一个不同的方法来解决问题,就像你刚才做的那样?太好了。如果我们有一些特定的条件,我们需要考虑一个,因为我们没有计算所有的元素或查找相同的结构。filter、reduce、forEach和map方法提供了不同的简化方法。