Многомерный массив JavaScript с использованием функции высокого порядка, такой как фильтр и длина

#javascript #arrays #multidimensional-array #higher-order-functions

#javascript #массивы #многомерный массив #функции более высокого порядка

Вопрос:

Я новичок в javascript и пытаюсь выяснить, как ответить на вопрос ниже, используя HOF со свойством length, но не смог. Мои друзья и я в конечном итоге нашли другое решение с использованием counter во время обсуждения нашего класса. Был бы признателен, если бы вы могли помочь в решении проблемы с использованием length или, возможно, некоторыми другими способами. Спасибо!

Проблема: каждый массив в этом массиве представляет возраст каждого игрока в футбольной команде Отфильтруйте те команды, в которых менее 3 игроков старше 20 лет. Подсказка: вы можете использовать функцию более высокого порядка (HOF) внутри обратных вызовов других HOF.

Тестовый пример: [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]] чтобы [[20, 31, 16, 21, 21], [17, 31, 16, 21, 21]]

Решение с использованием счетчика:

 Let currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

let newTeam  = currTeam.filter(team => {
  let count = 0;
  team.map(age => {
    if (age > 20) count  ;
  })
  if (count >= 3) return team;
})
  

Вопрос — Как изменить решение, чтобы использовать свойство length (другое HOF тоже хорошо) вместо использования counter? В настоящее время я использую HOFs — filter и map.

Ответ №1:

Отфильтруйте каждую группу и убедитесь, что ее длина после фильтрации больше 2. Каждая группа, которая не прошла тест, вернется false и будет отфильтрована основным циклом фильтрации:

 const currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

const newTeam  = currTeam.filter(team => 
  team.filter(age => age > 20).length > 2
);

console.log(newTeam);  

Если вы не хотите создавать промежуточные массивы, используя другой фильтр, вы можете использовать Array.reduce() для подсчета. Логическая операция (age > 20) возвращает логическое значение, и JS преобразует его в 0 для false и 1 для true при добавлении его к числу:

 const currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

const newTeam  = currTeam.filter(team => 
  team.reduce((count, age) => count   (age > 20), 0) > 2
);

console.log(newTeam);  

Примечания:

  1. Используется Array.map() для преобразования элементов массива, а не для побочных эффектов, таких как подсчет. Для побочных эффектов используйте Array.forEach() : team.forEach(age => { if (age > 20) count ; })
  2. Array.filter() Метод ожидает логическое значение, поэтому в исходном коде вы можете просто использовать return count >= 3;