Можно ли уменьшить мой код больше? - PullRequest
1 голос
/ 25 февраля 2020

Вот мой код.

function legalPeopleToDrive(people) {
  const myFilter = people
    .filter(p => p.age > 14)
    .map(p => {
      return p.name;
    });
  return myFilter;
}

const myObj = [
  { name: "John", age: 14 },
  { name: "Jim", age: 16 },
  { name: "Ben", age: 18 }
];

console.log(legalPeopleToDrive(myObj));

В значительной степени, мне просто очень любопытно узнать, возможно ли уменьшить это больше. Можно ли это сделать также с помощью одного из этих методов filter() или map()?

Ответы [ 3 ]

7 голосов
/ 25 февраля 2020

Вы можете создать желаемый результат, перебирая массив только один раз, что можно сделать с помощью .reduce. Вы также можете немедленно вернуть вызов метода массива - нет необходимости предварительно сохранять его в переменной. Другой вариант - использовать функцию стрелки для краткого возврата:

const legalPeopleToDrive = people => people.reduce((a, p) => {
  if (p.age > 14) a.push(p.name);
  return a;
}, []);

const myObj = [
  { name: "John", age: 14 },
  { name: "Jim", age: 16 },
  { name: "Ben", age: 18 }
];

console.log(legalPeopleToDrive(myObj));

Тем не менее, ваш текущий код выглядит хорошо для меня.

1 голос
/ 25 февраля 2020

Ответ:

Чтобы ответить на ваш вопрос в конце, «Это можно сделать также с помощью одного из этих методов 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));
}
0 голосов
/ 01 марта 2020

за один раз, вы могли бы написать функцию несколько более кратким / компактным способом:

const legalPeopleToDrive = people => people.filter(p => p.age > 14).map(p => p.name);

Это можно сделать также, просто используя один из этих методов filter() или map()?

не с этими методами, но:

const legalPeopleToDrive = people => people.flatMap(p => p.age > 14? p.name: []);

вы также можете вернуть Array.prototype вместо создания пустого массива, но это снова будет дольше.

Вы также можете написать это как функцию итератора / генератора. На самом деле это не способ сократить ваш код, но просто с помощью charcount, который все же короче вашего кода:

function* legalPeopleToDrive(people) {
  for (let p of people) if (p.age > 14) yield p.name;
}

const myObj = [
  { name: "John", age: 14 },
  { name: "Jim", age: 16 },
  { name: "Ben", age: 18 }
];

console.log([...legalPeopleToDrive(myObj)]);

только не забывайте, что ваш результат теперь является итератором, а не массивом.

...