Определите, существуют ли наборы пар ключ-значение в другом массиве объектов - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть 2 набора объектов javascript, один из которых содержит новый элемент, а другой содержит массив элементов.

Я хотел бы иметь возможность проверить существующий массив элементов, чтобы выяснить,новый элемент попадает в любой из существующих элементов на основе двух пар ключей и значений (это dateFrom и 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'
}]

Я хотел бы иметь возможность передавать оба элемента в функцию, которая будет возвращать логический ответ, в котором указано, существует ли новый элемент в существующей коллекции элементов.Заранее спасибо!Я предполагаю что-то вроде:

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

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Лучший способ решить эту проблему - использовать метод Javascripts Array.some, который возвращает логическое значение, если обратный вызов возвращает true для любого значения в массиве.В качестве бонуса, он останавливается, как только он видит значение true.

Таким образом, вы сравниваете 2 массива, мое решение будет выглядеть так, что может быть интерпретировано как newItem содержится вexistingItems массив на основе предоставленной вами логики.

function checkDateRanges(newItem, existingItems) {
  return existingItems.some((item) => {
    return item.dateFrom === newItem.dateFrom || 
      item.dateTo === newItem.dateTo;
  });
}
0 голосов
/ 16 февраля 2019

Вы очень близки с тем, что у вас есть.Во-первых, функция массива 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...