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
函数fromdate 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将其与所选日期
与currieddateFns.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
。谢谢你的解决方案。