首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript中的Reduce方法

JavaScript中的Reduce方法
EN

Stack Overflow用户
提问于 2018-06-27 05:51:26
回答 5查看 100关注 0票数 0

我猜这更像是一个逻辑问题,但它也涉及到reduce方法(我想它是解决这类问题的合适方法)。

下面是我的3个数组:

const availableHours = [ 9, 10, 11, 12, 13, 14 ]; const exArr1 = [ 9, 10, 11, 12, 13, 14 ] const exArr2 = [ 10, 11, 12, 13 ]

第一个表示所有可用的小时数。用户总是预订其中的两个,彼此相邻(f.ex。9和10、13和14、10和11,等等。)在任何配置下。现在,如果用户预订了所有三个集合(即9-10,11-12,13-14),我需要返回true。这意味着今天的行程都被订满了。但如果它是预订的f.ex的话。就像10-11和12-13一样,它也应该返回true,因为那些未预订的小时(9和14)不能预订,因为它们是单个小时。两个示例数组都应该返回true。

你能帮我解决这个问题吗?我试着用reduce方法来做这件事,但是做不到。

谢谢!

EN

回答 5

Stack Overflow用户

发布于 2018-06-27 06:10:50

这个答案没有使用Array.prototype.reduce,但我认为它解决了您的问题。

它的工作方式是首先从可用小时数列表中删除任何已预订的小时数。这假设预订的天数是正确的(连续预订的每小时对)。

然后,它遍历剩余的可用小时数,并检查连续的每小时对。如果没有找到,则认为当天的预订已满。如果找到一个或多个,则表示没有全部预订。

代码语言:javascript
复制
const available = [ 9, 10, 11, 12, 13, 14 ];
const day1 = [ 9, 10, 11, 12, 13, 14 ];
const day2 = [ 10, 11, 12, 13 ];
const day3 = [ 9, 10, 12, 13 ];
const day4 = [ 9, 10 ];

function isFullyBooked(day, available) {
  const remaining = available.filter((hour) => ! day.includes(hour));
  
  for (let i = 0; i < remaining.length; i++) {
    if (remaining[i] + 1 === remaining[i + 1]) return false;
  }
  
  return true;
}

console.log(isFullyBooked(day1, available));
console.log(isFullyBooked(day2, available));
console.log(isFullyBooked(day3, available));
console.log(isFullyBooked(day4, available));

票数 1
EN

Stack Overflow用户

发布于 2018-06-27 06:12:04

您可以使用includesfilter包含可用小时数组并返回差值:

代码语言:javascript
复制
const availableHours = [9, 10, 11, 12, 13, 14];
const exArr1 = [9, 10, 11, 12, 13, 14]
const exArr2 = [10, 11, 12, 13]

const check = (arr, avail) => {
  const diff = avail.filter(e => !arr.includes(e))

  if (diff.length === 0)
    console.log('all hours are booked')
  else
    console.log('unbooked hours : ', diff)

  return true

}

console.log(check(exArr1, availableHours))
console.log(check(exArr2, availableHours))

票数 0
EN

Stack Overflow用户

发布于 2018-06-27 06:20:24

您可以使用filter查找所需的块,如下所示:

代码语言:javascript
复制
const availableHours = [ 9, 10, 11, 12, 13, 14 ];
const exArr1 = [ 9, 10, 11, 12, 13, 14 ]
const exArr2 = [ 11, 12 ]

function getStartTimes(arr, taken) {
    return arr.filter((item, index) => index != availableHours.length -1 
        && !taken.includes(item)
        && !taken.includes(availableHours[index +1])
    )
}

console.log(getStartTimes(availableHours, exArr1))
console.log(getStartTimes(availableHours, exArr2))

返回的数组将是小时数组,可以开始2小时的块。如果您只想要true或false,您可以测试此数组的长度。

这也有一个优点,如果像[9, 12, 13, 14]一样保留一个小时的块,它仍然可以工作(结果应该显示一个两小时的块,从10开始可用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51051819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档