我想根据对象数组中的属性过滤对象。为此,我单独编写了过滤条件。
这是我调用过滤器条件
的地方.filter((service) => {
filterOverlappedServices(service);
})
这是我的过滤条件
const filterOverlappedServices = (service: Item): boolean => {
if (bookings) {
bookings.forEach((booking) => {
return moment(service?.duration?.start).isBetween(
booking.data[0]?.duration?.start,
booking.data[0]?.duration?.end,
'minute',
);
});
} else {
return true;
}
};
我在这里所做的是检查给定的日期字符串(isostring)是否在其他2个开始和结束时间之间的时间。
然而,这总是返回undefined并且还显示一个typescript错误
Function lacks ending return statement and return type does not include 'undefined'.
但不是我的函数返回true或false基于我的实现?从哪里返回一个未定义?
你得到错误是因为你的"筛选函数"没有返回任何东西。试着改变
.filter((service) => {
filterOverlappedServices(service);
})
.filter((service) => {
return filterOverlappedServices(service);
})
或者
.filter(filterOverlappedServices)
同样,forEach
中的返回值不会从filterOverlappedServices
返回。实际上,这个回报并没有起到什么作用。forEach
总是返回未定义的,所以,它的回调没有意义,有一个返回值。你要么在寻找map
,要么完全是其他的东西。
因为您使用的是.forEach
和回调函数,所以返回在外部函数中不做任何事情,只在回调中。
根据我的经验,.forEach
很少给我想要的东西,所以我通常把它改成for (const booking of bookings)
类型的循环。在这里,您可以返回到外部函数。
Btw:如果你在for循环中返回,只有第一个会返回,其他的会被跳过。
forEach
是ES5的残余,由于它使用回调函数而有一些限制。返回值被忽略,并且没有直接的方法来中断循环。
另一个问题是filter
忽略返回值。
为了检查一些数组元素是否符合条件,可以使用相应的方法:
.filter((service: Item) => {
return !bookings ? true : bookings.some((booking) => {
return moment...;
});
});