【问题标题】:Determine if sets of key and value pairs exists in another array of objects确定键值对集是否存在于另一个对象数组中
【发布时间】:2019-02-15 23:04:33
【问题描述】:

我有 2 组 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
  })
}

【问题讨论】:

  • 这并不难,但你能更明确地说明你想要什么,例如 from 和 to 应该完全匹配吗?还是应该重叠或被包含?另外,如果您控制data,我强烈建议您将日期存储为数字。

标签: javascript arrays object compare


【解决方案1】:

你已经很接近你所拥有的了。首先,数组函数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);

【讨论】:

    【解决方案2】:

    我能想到的解决这个问题的最好方法是使用 Javascripts 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;
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-26
      • 2020-08-23
      • 2021-02-14
      • 2016-06-05
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2019-03-31
      相关资源
      最近更新 更多