Запрос около Javascript (Обратный звонок и forEach) - PullRequest
1 голос
/ 16 марта 2020

Итак, я пытаюсь использовать forEach для написания функции с именем count (arr, callback).

Теоретически он должен возвращать количество элементов, для которых обратный вызов является истинным.

count([1, 2, 3, 4], (e) => e === 3)

Ожидается: 1, но получается: 0

count([1, 2, 3, 4], (e) => e > 1)

Ожидается: 3, но получил: 0

count([2, 1, 4, 5, 2, 8], (e) => e === 2)

Ожидается: 2, но получил: 0

Вот код, который я запускаю:

function count(arr, callback) {
  let values = 0;
  arr.forEach(callback) ? values++ : values;

  return values;
}

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Использование filter:

const count = (arr, c) => arr.filter(c).length;

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))
0 голосов
/ 16 марта 2020

function count(arr, callback) {
  let values = 0;
  arr.forEach(item => callback(item) ? values++ : values);
  return values;
}

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))
0 голосов
/ 16 марта 2020

forEach игнорирует возвращаемое значение своего обратного вызова. Используйте reduce вместо:

const count = (arr, cb) => arr.reduce((a, item) => a + cb(item), 0);

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))
...