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

时间:2019-02-15 23:04:34

标签: javascript arrays object compare

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

2 个答案:

答案 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是一个包含单个对象的数组。我猜想您可能想从该对象周围删除数组括号。但是,要像上面一样使用newItemexistingItems,就需要调用这样的函数(以获取该数组的第一个元素):

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;
  });
}