我有2套javascript对象,其中一组包含一个新项目,另一组包含一组项目。
我希望能够基于两对键和值(分别为dateFrom
和{ {1}},并且理想情况下,即使新项目位于现有项目中的任何日期之间也是如此。
dateTo
我想要的是能够将两个项目都传递给一个函数,该函数将返回一个布尔值回答,该回答指出新项目是否不存在于现有项目集合中。 提前致谢! 我猜是这样的:
const newItem = [{
id: null,
dateFrom: '2019-02-01',
dateTo: '2019-02-28'
}]
const existingItems = [{
id: 1,
dateFrom: '2019-01-01',
dateTo: '2019-01-31'
},{
id: 2,
dateFrom: '2019-02-01',
dateTo: '2019-02-28'
},{
id: 3,
dateFrom: '2019-03-01',
dateTo: '2019-03-31'
}]
答案 0 :(得分:0)
您与那里的一切非常接近。首先,数组函数find可能是一个不错的选择。它只会找到第一个匹配项,通常比循环遍历整个数组更有效。看起来像这样:
function checkDateRanges(newItem, existingItems) {
const match = existingItems.find(item=>
item.dateFrom == newItem.dateFrom &&
item.dateTo == newItem.dateTo
);
return match!==undefined;
}
正如您所说,这将返回一个布尔值。但是当然,您也可以返回实际的对象匹配项,或者如果您想要匹配项的数组索引,则还有findIndex。
要注意的另一件事是您上面的newItem
是一个包含单个对象的数组。我猜想您可能想从该对象周围删除数组括号。但是,要像上面一样使用newItem
和existingItems
,就需要调用这样的函数(以获取该数组的第一个元素):
checkDateRanges(newItem[0], existingItems);
答案 1 :(得分:0)
我认为解决此问题的最佳方法是使用Javascript Array.some
方法,如果回调对数组中值的 any 返回true,则返回布尔值。作为奖励,它会在看到true
值后立即停止。
因此,您正在比较2个数组,我的解决方案看起来像这样,可以根据您提供的逻辑将其解释为newItem
数组中包含的existingItems
。
function checkDateRanges(newItem, existingItems) {
return existingItems.some((item) => {
return item.dateFrom === newItem.dateFrom ||
item.dateTo === newItem.dateTo;
});
}