Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用带ramda的谓词相互过滤两个列表_Javascript_Arrays_Filter_Ramda.js - Fatal编程技术网

Javascript 使用带ramda的谓词相互过滤两个列表

Javascript 使用带ramda的谓词相互过滤两个列表,javascript,arrays,filter,ramda.js,Javascript,Arrays,Filter,Ramda.js,我有一组房间,每个房间都包含另一组disabledday,无法在其中预订: const rooms = [ { disabledDays: [], title: 'roomOne' }, { disabledDays: ['2019-07-10T01:00:00.000Z'], title: 'roomTwo' }, { disabledDays: [ '2019-07-08T01:00:00.000Z', '2

我有一组房间,每个房间都包含另一组
disabledday
,无法在其中预订:

const rooms = [
  {
    disabledDays: [],
    title: 'roomOne'
  },
  {
    disabledDays: ['2019-07-10T01:00:00.000Z'],
    title: 'roomTwo'
  },
  {
    disabledDays: [
      '2019-07-08T01:00:00.000Z',
      '2019-07-09T01:00:00.000Z',
      '2019-07-02T01:00:00.000Z'
    ],
    title: 'roomThree'
  },
  {
    disabledDays: [],
    title: 'roomFour'
  }
];
然后,我还有一系列选定的日期,我想使用这些日期来查找以下可用房间:

const selectedDates = [
  '2019-07-06T01:00:00.000Z',
  '2019-07-07T01:00:00.000Z',
  '2019-07-08T01:00:00.000Z',
  '2019-07-09T01:00:00.000Z'
];
在本例中,我想查找
房间
,它们的
禁用日期
数组中没有
所选日期

到目前为止,我的尝试使用了
映射
拒绝
任何
的组合,但是这似乎并没有返回满房间

const result = map(
  room => reject(
    date => any(disabled => isSameDay(date, disabled), selectedDates),
    prop('disabledDays', room)
  ),
  rooms
)

我使用
isSameDay
函数from
date fns
作为谓词来测试日期是否相同。

以下是一种方法的
ES6
lodash
Ramda
版本。我用
过滤器
any/some
选择了不同的路线,因为这对我来说更有意义。我相信您也可以使用
reject
执行此操作,但我不确定您是否会从开始,因为map将期望返回相同的
length
数组:

constrooms=[{disabledDays:[],标题:'roomOne'},{disabledDays:['2019-07-10T01:00:00.000Z'],标题:'roomTwo'},{disabledDays:['2019-07-08T01:00:00.000Z',2019-07-02T01:00.000Z'],标题:'roomThree,{disabledDays:[],标题:'roomFour'];
常数选择日期=['2019-07-06T01:00:00.000Z'、'2019-07-07T01:00:00.000Z'、'2019-07-08T01:00:00.000Z'、'2019-07-09T01:00:00.000Z';
让js=rooms.filter({disabledDays,title})=>
!disabledDays.some(d=>selectedDates.some(s=>dateFns.isSameDay(d,s)))
让lodash=\过滤(房间,r=>
!\有些(r.disabledDays,d=>\有些(selectedDates,s=>dateFns.isSameDay(d,s)))
让r=r.filter(r=>!r.any(d=>r.any(s=>
日期fns.isSameDay(d,s),选定日期,r.disabledday),房间)
log('js:',js)
控制台日志(“”:’,lodash)
console.log('R:',R)

使用Ramda,我将使用R.reject,并创建一个带有R.props的谓词,该谓词使用R.any将其与
所选日期
与curried
dateFns.isSameDay
以及翻转的R.any进行匹配:

const{curry,reject,propsempts,any,pipe,flip}=R
const eqByDate=咖喱(dateFns.isSameDay)
const fn=selectedDates=>reject(拒绝)(
任何(管道)(
eqByDate,
翻转(任何)(选定日期),
)),
“残疾人士”,
))
const rooms=[{disabledDays:[],标题:'roomOne'},{disabledDays:['2019-07-10T01:00:00.000Z'],标题:'roomTwo'},{disabledDays:['2019-07-08T01:00:00.000Z',2019-07-02T01:00.000Z'],标题:'roomThree,{disabledDays:[],标题:'roomFour'];
常数选择日期=['2019-07-06T01:00:00.000Z'、'2019-07-07T01:00:00.000Z'、'2019-07-08T01:00:00.000Z'、'2019-07-09T01:00:00.000Z';
const result=fn(选定日期)(房间)
console.log(结果)

我忽略了你对日期fns的依赖。但是,如果这些是您需要使用的字符串,那么简单的字符串比较就可以了?如果您需要使用
日期fns
,那么Ori Drori答案可能就是您想要的


您可以使用
intersection
查找两个日期列表之间的公共日期

然后,您可以构建一个谓词,该谓词将保留没有公共日期的所有房间:

const rooms=[
{
禁用日期:[],
标题:“roomOne”
},
{
禁用日期:['2019-07-10T01:00:00.000Z'],
标题:“第二房间”
},
{
禁用日期:[
“2019-07-08T01:00:00.000Z”,
“2019-07-09T01:00:00.000Z”,
“2019-07-02T01:00:00.000Z”
],
标题:“三号房间”
},
{
禁用日期:[],
标题:“四号房间”
}
];
常数选定日期=[
“2019-07-06T01:00:00.000Z”,
“2019-07-07T01:00:00.000Z”,
“2019-07-08T01:00:00.000Z”,
“2019-07-09T01:00:00.000Z”
];
常数z=(日期、房间)=>
过滤器(组合(isEmpty、交叉点(dates))、‘disabledDays’、房间);
console.log(
z(选定的日期、房间)
);


常数{交集,过滤器,满足,合成,等空}=R啊,这是我似乎丢失的第二个
any
。谢谢你的解决方案。