【问题标题】:Range Filter by within array of object范围过滤对象数组内
【发布时间】:2021-01-10 10:18:00
【问题描述】:

我想制作班次解析器助手,它是生成工作班次的时间,下面是班次规则

  let shift_rule = [
    {
      shift: '07-12',
      start: 7,
      finish: 12
    },
    {
      shift: '12-17',
      start: 12,
      finish: 17
    },
    {
      shift: '17-22',
      start: 17,
      finish: 22
    },
  ];

如果时移是timeStart = 7timeFinish = 17

预期输出:

[
    {
      shift: '07-12',
      start: 7,
      finish: 12
    },
    {
      shift: '12-17'
      start: 12,
      finish: 17
    },
]

我已经尝试用这段代码解决了

shift_rule
    .map((time) => ((timeFinish > time.start)) && time)
    .filter(item => typeof item !== 'boolean');

但是当过滤器是time.start = 17timeFinish = 22时,它显示:

[
    {
      shift: '07-12',
      start: 7,
      finish: 12
    },
    {
      shift: '12-17',
      start: 12,
      finish: 17
    },
    {
      shift: '17-22',
      start: 17,
      finish: 22
    },
  ]

希望可以用 ES6 函数式解决

【问题讨论】:

  • 首先,先使用过滤器再使用地图总是更好更干净。 typeof item !== 'boolean' 有点差劲。其次,在您的地图功能中,您没有检查timeStart 的任何内容。不应该是time.start >= timeStart && time.finish <= timeFinish吗?

标签: javascript arrays object ecmascript-6 filter


【解决方案1】:

您可以通过检查每个范围的开始是否在另一个结束之前来检查重叠的时间范围(例如,参见this question)。您可以在过滤器中实现该代码,然后使用 map 仅返回班次名称:

let shift_rule = [
  { shift: '07-12', start: 7, finish: 12 },
  { shift: '12-17', start: 12, finish: 17 },
  { shift: '17-22', start: 17, finish: 22 } 
];

const filter_shifts = (rules, timeStart, timeFinish) =>
  rules.filter(s => s.start < timeFinish && s.finish > timeStart).map(s => s.shift);

console.log(filter_shifts(shift_rule, 7, 17));
console.log(filter_shifts(shift_rule, 17, 22));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多