Почему операция reduce не накапливает значения?

Как можно улучшить работу функции countSmileys, чтобы правильно считать количество входных смайликов согласно переменной arrCurrentSmileys и вернуть нужное значение?
  • 9 апреля 2024 г. 19:49
Ответы на вопрос 1
Операция reduce не накапливает значения, потому что она возвращает результат последней выполненной операции, а не хранит все значения в промежуточном состоянии. Для накапливания значений можно использовать переменную вне функции reduce или возвращать объект с обновленными значениями.

Чтобы улучшить работу функции countSmileys, чтобы правильно считать количество входных смайликов согласно переменной arrCurrentSmileys и вернуть нужное значение, можно внести следующие изменения:

1. Использовать метод filter для отбора только смайликов из массива arr и затем проверять их на наличие в arrCurrentSmileys.

Пример:

```javascript
function countSmileys(arr, arrCurrentSmileys) {
  return arr.filter(smiley => arrCurrentSmileys.includes(smiley)).length;
}

const arr = [':)', ';)', ':(', ':|', ';]'];
const arrCurrentSmileys = [':)', ';)'];

console.log(countSmileys(arr, arrCurrentSmileys)); // Вернет 2
```

2. Использовать объект для хранения количества каждого смайлика и возвращать сумму значений.

Пример:

```javascript
function countSmileys(arr, arrCurrentSmileys) {
  const smileyCount = {};
  
  arr.forEach(smiley => {
    if (arrCurrentSmileys.includes(smiley)) {
      smileyCount[smiley] = (smileyCount[smiley] || 0) + 1;
    }
  });

  return Object.values(smileyCount).reduce((acc, count) => acc + count, 0);
}

const arr = [':)', ';)', ':(', ':)', ';)', ':)'];
const arrCurrentSmileys = [':)', ';)'];

console.log(countSmileys(arr, arrCurrentSmileys)); // Вернет 3
```

Эти изменения позволят правильно считать количество входных смайликов согласно заданным условиям и возвращать нужное значение.
Похожие вопросы