需要用forEach来return'callback'函数结果为真的元素个数

Need to use forEach to return the number of elements for which the 'callback' function result is true

我需要使用forEach来解决这个问题,我有点卡住了!我认为我不能像使用 for 循环那样使用 'count',因为我不能在 forEach 中使用 return。所以我写的仍然是错误的,但这是我目前所拥有的:

function count(arr, callback) {
  let result = 0;
  arr.forEach(ele => {
    if (ele === callback())  {
       result += ele.length;
}
  });
  return result;
}

但它没有通过所有测试:

>
count([1, 2, 3, 4], (e) => e === 3);
Expected: 1 but got: 0
>
count([1, 2, 3, 4], (e) => e > 1);
Expected: 3 but got: 0
>
count([2, 1, 4, 5, 2, 8], (e) => e === 2);
Expected: 2 but got: 0
>
count(['a', 'b'], (e) => e === 'd');
Expected: 0 OK!
>
count([], (e) => e === 'd');
Expected: 0 OK!

有人可以提供帮助吗?重申一下,我确实需要使用 forEach 来解决这个问题!

问题出在 if 块中。您需要将元素传递给 callback(),然后检查它返回的是真还是假。如果为真,则将结果递增 1。

    function count(arr, callback) {
      let result = 0;
      arr.forEach(ele => {
        if ( callback(ele))  {
           result += 1;
    }
      });
      return result;
    }
console.log(count([1, 2, 3, 4], (e) => e === 3));
console.log(count([1, 2, 3, 4], (e) => e > 1));
console.log(count([2, 1, 4, 5, 2, 8], (e) => e === 2));
console.log(count(['a', 'b'], (e) => e === 'd'));
console.log(count([], (e) => e === 'd'));

你的 callback 是一个函数,它接受一个元素并检查它是否匹配一个值

(e) => e === 2 => 获取一个 e 并检查 e 是否为 2

所以在forEach迭代的时候需要传数组项

此外,对于每场比赛,您将 result 递增 1 而不是 ele.length

function count(arr, callback) {
  let result = 0;
  arr.forEach(ele => {
    if (callback(ele))  { // Pass ele to the callback
       result += 1; // Add 1 to result for every match
}
  });
  return result;
}
console.log(`Expected: ${count([2, 1, 4, 5, 2, 8], (e) => e === 2)}`);

尝试过滤解决方案:

function count(arr, callback) {
  const result = arr.filter(callback);
  
  return result.length;
}

你的解决方案有两个问题,

  1. 您正在调用 callback 但未传递值
  2. callback 中您需要一个布尔值,因此再次不需要 ele === callback()

它不起作用的原因是因为 ele === callback() 永远不会满足。

所以,你可以像这样修改代码

function count(arr, callback) {
  let result = 0;
  arr.forEach(ele => {
    //call the callback with the element
    if (callback(ele)) {
    //Update the count by 1 when truthy value returned from callback
      result += 1;
    }
  });
  return result;
}

console.log(count([1, 2, 3, 4], (e) => e === 3));
console.log(count([1, 2, 3, 4], (e) => e === 3));
console.log(count([1, 2, 3, 4], (e) => e > 1));
console.log(count([2, 1, 4, 5, 2, 8], (e) => e === 2));
console.log(count(['a', 'b'], (e) => e === 'd'));
console.log(count([], (e) => e === 'd'));

   function count(arr, callback) {
    let result =[];
    arr.forEach(ele => {
      if (callback(ele))  {
         result.push(ele);
      }
    });
    return result.length;
}