【问题标题】:How can I call filter once when I need to filter multiple things at the same time?当我需要同时过滤多个东西时,如何调用过滤器一次?
【发布时间】:2019-02-20 18:45:56
【问题描述】:

我正在使用 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 次。我该如何优化它以便调用一次?

【问题讨论】:

  • 我认为您正在寻找 lodash 的 groupBy 功能...
  • 这可能会有所帮助:Destructuring assignment
  • 我该如何使用@gaetanoM
  • filterByCardinalPoint 可以接受一个值数组作为第二个参数并返回一个数组或结果......
  • @gaetanoM 能否请您提供一个代码示例,以便我可以根据我的代码进行调整

标签: javascript ecmascript-6 lodash


【解决方案1】:

由于您需要每个方向的人数,您可以使用_.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>

【讨论】:

  • 它声称passengersGoingX 变量已经在上层范围内声明。
  • SyntaxError: /PassengersCircle.js: You're trying to assign to a parenthesized expression, eg. instead of ({a}) = 0` 使用({a} = 0) (67:5) 65 | // )。长度; 66 | > 67 | ({ | ^ 68 | N:passengersGoingNorth,69 | S:passengersGoingSouth,70 | W:passengersGoingWest,`
  • 更新了一个工作示例。除了代码本身的默认值没有任何变化。您的错误是因为括号在错误的位置 - 而不是 ({a}) = 0` 使用 ({a} = 0)
  • 加上那个属性还有一个我需要过滤:[{ cardinalpoint: 'N', pickup: 0 }, { cardinalpoint: 'N', pickup: 1 }] 我需要获取一个新的 1 数组。我可以在该代码中包含一个选项吗?
  • 此代码特定于问题,您已在问题中提出,它不会过滤任何内容 - 它很重要。您的第二个问题可能应该使用标准过滤器。
【解决方案2】:

也许这太老套了,但是一个简单的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让乘客南下。

【讨论】:

    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 2019-06-19
    • 2015-03-18
    • 2014-07-18
    • 1970-01-01
    • 2015-02-09
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多