确定另一个对象数组中是否存在键值对集



我有两组javascript对象,一组包含一个新项目,另一组包含项目数组。

我希望能够检查现有的项目数组,以根据两对键和值(这些键和值是dateFromdateTo,理想情况下,即使新项目落在现有项目中的任何日期之间)。

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'
}]

我想要的是能够将这两个项目传递给一个函数,该函数将返回一个布尔答案,该答案说明现有项目集合中是否存在新项目。 提前感谢! 我猜的是这样的:

checkDateRanges(newItem, existingItems) {
forEach.existingItems(item => {
item.dateFrom = newItem.dateFrom ||
item.dateTo = newItem.dateTo
})
}

你与你那里的东西非常接近。首先,数组函数查找可能是一个不错的选择。它只会找到第一个匹配项,这通常比遍历整个数组更有效。它看起来像这样:

function checkDateRanges(newItem, existingItems) {
const match = existingItems.find(item=> 
item.dateFrom == newItem.dateFrom &&
item.dateTo == newItem.dateTo
);
return match!==undefined;
}

正如您所说,这将返回一个布尔值。但是当然你也可以返回实际的对象匹配,或者如果你想要匹配的数组索引,还有findIndex。

需要注意的另一件事是,上面的newItem是一个包含单个对象的数组。我猜您可能想从该对象周围删除数组括号。但是对于newItemexistingItems与上面完全相同的函数,您需要像这样调用函数(以获取该数组的第一个元素):

checkDateRanges(newItem[0], existingItems);

我能想到的解决这个问题的最好方法是使用 JavascriptsArray.some方法,如果回调对数组中的任何值返回 true,则返回布尔值。作为奖励,一旦看到true值,它就会停止。

所以你正在比较 2 个数组,我的解决方案看起来像这样,可以根据你提供的逻辑解释为newItem包含在existingItems数组中。

function checkDateRanges(newItem, existingItems) {
return existingItems.some((item) => {
return item.dateFrom === newItem.dateFrom || 
item.dateTo === newItem.dateTo;
});
}

最新更新