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