【问题标题】:.every() only accounts for the last element in the array.every() 只考虑数组中的最后一个元素
【发布时间】:2020-08-09 23:11:07
【问题描述】:

我正在尝试遍历对象内部的对象数组,并根据提供的 startTime 和 endTime 返回可用的办公桌。每个服务台都保留不应与提供的开始和结束时间重叠的预订。但是,当我遍历它时,如果数组中的最后一张桌子与提供的数据不冲突,代码只会返回一张桌子。如果它与最后一个元素冲突,则返回 undefined。

const org = {
  id: '123',
  name: 'apple',
  numofDesks: 12,
  desks: [
    {
      deskID: '1',
      bookings: [
        {
          id: '123',
         date: {
            day: 14,
            month: 02,
            year: 1999,
          },
          startTime: 14,
          finishTime: 16,
        },
        {
          id: '123',
          date: {
            day: 14,
            month: 02,
            year: 1999,
          },
          startTime: 17,
          finishTime: 20,
        },
      ],
      deskID: '2',
      bookings: [
        {
          id: '123',
          date: {
            day: 14,
            month: 02,
            year: 1999,
          },
          startTime: 11,
          finishTime: 12,
        },
        {
          id: '123',
          date: {
            day: 14,
            month: 02,
            year: 1999,
          },
          startTime: 8,
          finishTime: 10,
        },
      ],
    },
  ],
};

const booking = {
 startTime: 8,
 finishTime: 11,
};

const avaliableDesks = org.desks.find(({ bookings }) =>
  bookings.every(
    ({ startTime, finishTime }) =>
      //checks if the start&end times overlap with the existing booking 
      !(booking.startTime <= finishTime && startTime <= booking.finishTime),
  ),
);

【问题讨论】:

  • booking 在哪里定义,它的值是多少?
  • 您可以使用filter返回所有符合条件的办公桌(而不是find):developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • desks 数组只包含一个对象。但是这个对象已经分配了两次deskId 和bookings ...我认为对象结构不正确。
  • ^ 这个。缺少], [!因此,并不是代码仅在 last 元素正常的情况下才有效,而是如果 only 元素正常,因为只有一个(具有第二个的值定义,因为定义同名属性两次将使用最后一个值)!
  • @PeterSeliger 谢谢。我花了大约 2 个小时试图弄清楚这一点......

标签: javascript


【解决方案1】:

Array#filter 是你想要的方法,而不是Array#find。

const avaliableDesks = org.desks.filter(({ bookings }) =>
  bookings.every(
    ({ startTime, finishTime }) =>
      //checks if the start&end times overlap with the existing booking
      !(booking.startTime <= finishTime && startTime <= booking.finishTime),
  ),
);

【讨论】:

  • filter 可以返回多个结果,是的,但如果只是这个问题,那么find 不会也能正常工作吗?除了undefined 和find 之外,我还期望得到一个结果......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多