Напечатайте два или более вхождения, используя Redu () в JavaScript - PullRequest
0 голосов
/ 21 февраля 2019

Итак, у меня есть этот набор пилотов:

var pilots = [
  {
    id: 10,
    name: "Poe Dameron",
    years: 14,
  },
  {
    id: 2,
    name: "Temmin 'Snap' Wexley",
    years: 30,
  },
  {
    id: 41,
    name: "Tallissan Lintra",
    years: 16,
  },
  {
    id: 99,
    name: "Ello Asty",
    years: 22,
  }
];

И я хочу напечатать самого опытного пилота.С помощью Reduce () я могу распечатать наиболее опытный.Но эта функция уменьшения напечатает последний пилот с большим опытом.В приведенном выше массиве отлично работает уменьшение:

var mostExpPilot = pilots.reduce(function (oldest, pilot) {
  return (oldest.years || 0) > pilot.years ? oldest : pilot;
}, {});

console.log(mostExpPilot); // Prints { id: 2, name: 'Temmin \'Snap\' Wexley', years: 30 }

Если у нас есть 2 или более пилота с одинаковым опытом, и я хочу напечатать оба вхождения.Например, у нас есть массив ниже, где есть два пилота с одинаковым опытом работы.Реализованная функция уменьшения печатает только последний пилот.

var pilots = [
    {
      id: 10,
      name: "Poe Dameron",
      years: 14,
    },
    {
      id: 2,
      name: "Temmin 'Snap' Wexley",
      years: 30,
    },
    {
      id: 41,
      name: "Tallissan Lintra",
      years: 30,
    },
    {
      id: 99,
      name: "Ello Asty",
      years: 22,
    }
  ];



//find the most experienced pilot 
var mostExpPilot = pilots.reduce(function (oldest, pilot) {
    return (oldest.years || 0) > pilot.years ? oldest : pilot;
  }, {});

console.log(mostExpPilot); // prints { id: 41, name: 'Tallissan Lintra', years: 30 }

Могу ли я сделать это с помощью Redu ()?Если да, не могли бы вы дать мне знать?Если нет, как я могу это сделать?Благодаря. **

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Следующее сводит все к двум строкам, но занимает больше проходов, чем сокращений (что занимает всего одну).Тем не менее, если размер выборки всегда будет небольшим, читаемость может стоить того:

const mostYearsExperience = Math.max.apply({}, pilots.map(p => p.years));
const mostExperiencedPilots = pilots.filter(p => p.years === mostYearsExperience);
0 голосов
/ 21 февраля 2019

Если у нас есть 2 или более пилотов с одинаковым опытом, и я хочу напечатать оба экземпляра.

Для этого вам нужно будет вернуть массив.Если вы собираетесь вернуть массив , иногда , лучше всего возвращать массив всегда (даже если в нем будет только одна запись).

Высделал бы это, возвращая массив только с текущим пилот-сигналом, если у этого пилот-сигнала больше опыта, чем у ранее известного пилот-сигнала, добавляя текущий пилот-сигнал в массив, если у них такой же опыт, или сохраняя ранее известный пилот-сигнал в противном случае:

var pilots = [
    {
      id: 10,
      name: "Poe Dameron",
      years: 14,
    },
    {
      id: 2,
      name: "Temmin 'Snap' Wexley",
      years: 30,
    },
    {
      id: 41,
      name: "Tallissan Lintra",
      years: 30,
    },
    {
      id: 99,
      name: "Ello Asty",
      years: 22,
    }
];

// Find the most experienced pilots
var mostExpPilot = pilots.reduce(function(most, pilot) {
    var mostYears = most[0] ? most[0].years : -1;
    if (mostYears < pilot.years) {
        return [pilot];
    }
    if (mostYears === pilot.years) {
        most.push(pilot);
    }
    return most;
}, []);

console.log(mostExpPilot);
0 голосов
/ 21 февраля 2019
var mostExpPilot = pilots.reduce(function (oldest, pilot) {
    return oldest[0].years < pilot.years ? [pilot] : (oldest[0].years == pilot.years ? [...oldest, pilot] : oldest);
  }, [pilots[0]]);

console.log(mostExpPilot);
0 голосов
/ 21 февраля 2019

Можно, хотя это не очень распространенная идиома:

const oldestPilots = pilots => pilots.reduce((oldest, pilot) => {
  if (!oldest.length || oldest[0].years < pilot.years) return [pilot];
  if (oldest[0].years == pilot.years) return [...oldest, pilot];
  return oldest;
}, [])
...