@evg_96

Как отфильтровать и изменить элементы в массиве?

Есть массив содержащий четные и нечетные числа:
const arr = [1, 2, 5, 6, 8, 9, 10, 23, 32, 12, 65, 8, 4, 3, 65, 43, 23, 22, 55, 43, 66];

Необходимо отфильтровать и изменить элементы так чтобы в итоге получился массив слов "boom" и "wow",
где "boom" - это было нечетным числом меньше 10,
а "wow" - это было нечетное число больше 10.

В итоге должен получиться массив:
["boom", "boom", "boom", "wow", "wow", "boom", "wow", "wow", "wow", "wow", "wow"]


Пробовал написать, получилось, но что то как то не очень то и красиво.
Можно ли как то реализовать это все по другому, более как то красиво?

Реализация через обычный цикл for:

const boom = arr => {
  let result = [];

  for (let i = 0; i < arr.length; i += 1) {
    if (arr[i] % 2 !== 0) {
      if (arr[i] < 10) {
        result.push("boom");
      } else {
        result.push("wow");
      }
    }
  }

  return result;
};


Реализация при помощи функциональных методов:

let result = arr.filter(item => {
  if (item % 2 !== 0) {
    return item;
  }
}).map(item => {
  if (item < 10) {
    return "boom"
  } else {
    return "wow";
  }
});


Можно написать это в компактном функциональном стиле?
Написал на Haskell:
boom arr = [if x < 10 then "boom" else "wow" | x <- arr, odd x]

Можно ли сделать что то подобное по компактности в JS. Нативного метода в JS как мне известно нет, который бы и фильтровал и изменял данные списка. Как написать такой метод с callback?
  • Вопрос задан
  • 2050 просмотров
Решения вопроса 2
Конечно на функциональщину js более беден, чем haskell, но в данном случае можно сделать так:
const result = arr
    .filter(x => x % 2)
    .map(x => x < 10 ? 'boom' : 'wow')


В обычном императивном стиле
const result = []
for (let item of arr) {
    if (item % 2) {
        result.push(item < 10 ? 'boom' : 'wow')
    }
}
Ответ написан
Комментировать
vixwork
@vixwork
programmer
[1, 2, 5, 6, 8, 9, 10, 23, 32, 12, 65, 8, 4, 3, 65, 43, 23, 22, 55, 43, 66].reduce((x, y) => { return (y % 2 == 0) ? x : x.concat((y < 10) ? 'boom' : 'wow') }, [])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы