Ответ:
Чтобы ответить на ваш вопрос в конце, «Это можно сделать также с помощью одного из этих методов filter () или map ()?» : Да - это может быть сделано только одним из filter
или map
, однако он не будет использовать filter
или map
, как предполагалось, и в этом случае рекомендуется reduce
или forEach
.
const legalPeopleToDrive = people => {
const a = [];
people.map(p => {
if (p.age > 14) {
a.push(p.name);
}
});
return a;
}
// An uber-short form would be:
// let legalPeopleToDrive = (people, a = []) => (people.map(p => p.age > 14 && a.push(p.name)), a);
const myObj = [
{ name: "John", age: 14 },
{ name: "Jim", age: 16 },
{ name: "Ben", age: 18 }
];
console.log(legalPeopleToDrive(myObj));
Вопросы производительности:
Некоторые другие идеи на этой странице могут привести к более высокой задержке в случае больших наборов или нескольких итераций; в общем, избегайте создания новых массивов внутри итерации, что делают или заставляют flatMap()
и concat()
. Сканирование массива дважды с filter()
и map()
также хуже, чем forEach()
, for
l oop и reduce()
без concat()
.
const funcs = [
"people => people.flatMap(p => p.age > 14 ? [p.name] : []);",
"people => people.reduce((a, p) => p.age > 14 ? a.concat(p.name) : a, []);",
"people => {let a = []; people.map(p => p.age > 14 && a.push(p.name)); return a;};",
"people => people.filter(p => p.age > 14).map(p => p.name);",
"people => {let a = []; for (let p of people) p.age > 14 && a.push(p.name); return a;};",
"people => people.reduce((a, p) => (p.age > 14 && a.push(p.name), a), []);",
"people => {let a = []; people.forEach(p => p.age > 14 && a.push(p.name)); return a;};",
"people => [...(function*(people){for (let p of people) if (p.age > 14) yield p.name;})(people)];",
].sort(_ => .5 - Math.random());
const myObj = [
{ name: "John", age: 14 },
{ name: "Jim", age: 16 },
{ name: "Ben", age: 18 }
];
for (let f of funcs) {
const legalPeopleToDrive = eval(f);
const start = new Date();
for (let i=0;i<1000000;++i) legalPeopleToDrive(myObj);
console.log(f, new Date() - start, 'ms'); //, legalPeopleToDrive(myObj));
}