Как я могу вызвать фильтр один раз, когда мне нужно отфильтровать несколько вещей одновременно? - PullRequest
0 голосов
/ 20 февраля 2019

Я использую lodash для выполнения некоторой фильтрации.

У меня есть следующие функции:

filterByCardinalPoint = (key, value) => {
    const { passengersData } = this.props;
    console.log('passengersData', passengersData);
    return filter(passengersData, [key, value]);
  };

  callFilter = () => {
    passengersGoingNorth = this.filterByCardinalPoint('cardinalpoint', 'N')
      .length;
    passengersGoingSouth = this.filterByCardinalPoint('cardinalpoint', 'S')
      .length;
    passengersGoingWest = this.filterByCardinalPoint('cardinalpoint', 'W')
      .length;
    passengersGoingEast = this.filterByCardinalPoint('cardinalpoint', 'E')
      .length;
  };

И я вызываю callFilter в методе рендеринга.Эта функция вызывается около 8 раз.Как я могу оптимизировать это так, чтобы звонить один раз?

Ответы [ 2 ]

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

Поскольку вам нужно количество людей, идущих в каждом направлении, вы можете использовать _.countBy() с _.property() в качестве итерируемого.Удалите объект результата, чтобы присвоить числа переменным.

Пример:

const { countBy, property } = _;

let passengersGoingNorth, passengersGoingSouth, passengersGoingWest, passengersGoingEast;

const passengersData = [{ cardinalpoint: 'N' }, { cardinalpoint: 'N' }, { cardinalpoint: 'S' }, { cardinalpoint: 'N' }, { cardinalpoint: 'E' }];

({
  N: passengersGoingNorth = 0,
  S: passengersGoingSouth = 0,
  W: passengersGoingWest = 0,
  E: passengersGoingEast = 0
} = countBy(passengersData, property('cardinalpoint')));

console.log(passengersGoingNorth, passengersGoingSouth, passengersGoingWest, passengersGoingEast); // 3, 1, 0, 1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 20 февраля 2019

Возможно, это слишком старая школа, но как насчет простого цикла for:

 for(const { cardinalpoint } of passengersData) {
   if(cardinalpoint === "N")
    passengersGoingNorth++;
   if(cardinalpoint === "S")
    passengersGoingSouth++;
   if(cardinalpoint === "E")
    passengersGoingEast++;
   if(cardinalpoint === "W")
    passengersGoingWest++;
 }

Если это слишком многократно, просто используйте направление в качестве ключа поиска:

 const directions = { N: 0, S: 0, W: 0, E: 0 };
 for(const passenger of passengersData)
   directions[ passenger.cardinalpoint ]++;

Тогда вы можете заставить пассажиров идти на юг как directions.S.

...