Определить разницу между значениями в объекте и массиве

У меня есть следующий объект и массив чисел. Как я могу определить, какое число в массиве не существует в качестве идентификатора в объекте? В следующем примере мне нужно 1453.

[
  {id: 60, itemName: 'Main Location - 1100 Superior Road - Cleveland'}
  {id: 1456, itemName: 'Third Location - 107,West 20th Street,Manhattan - New York'}
]

[60, 1453, 1456]

🤔 А знаете ли вы, что...
JavaScript имеет множество встроенных объектов, таких как Array, Date и Math.


50
3

Ответы:

Решено

Вы можете создать список идентификаторов существующих идентификаторов данных, используя .map() , а затем использовать .filter() и .includes()

const data = [
  {id: 60, itemName: 'Main Location - 1100 Superior Road - Cleveland'},
  {id: 1456, itemName: 'Third Location - 107,West 20th Street,Manhattan - New York'}
]

const ids = [60, 1453, 1456];
const dataIDs = data.map(ob => ob.id);  // [60, 1456]
const notExistentIDs = ids.filter(id => !dataIDs.includes(id));

console.info(notExistentIDs);  // [1453]

который вернет массив всех идентификаторов объектов (из data), не перечисленных в вашем справочном массиве ids.


Решение @Roko абсолютно правильное и, вероятно, намного быстрее. Вот мой альтернативный подход с использованием .reduce() и .some():

const data = [
  { id: 60, itemName: "Main Location - 1100 Superior Road - Cleveland" },
  { id: 1456, itemName: "Third Location - 107,West 20th Street,Manhattan - New York" }
];
const ids = [60, 1453, 1456];

const result = ids.reduce(
  (acc, curr) =>
  data.some(d => d.id === curr) ? acc : [...acc, curr], []
);

console.info(result);

Для большего количества элементов данных и большего количества ids я бы выбрал подход, который создает поиск на основе Set через карту, пингуя каждый из itemList элемента id...

const idLookup = new Set(itemList.map(({ id }) => id));

Поиск элементов непосредственно из экземпляра Set или Карты выполняется намного быстрее, чем, например. повторяя снова и снова массив с помощью find или включает для каждого шага итерации задачи внешнего фильтра.

Фильтровать список несоответствующих элементов id так же просто, как...

const listOfNonMatchingIds = idList.filter(id => !idLookup.has(id));

... пример кода ...

const itemList = [
  { id: 60, itemName: 'Main Location - 1100 Superior Road - Cleveland' },
  { id: 1456, itemName: 'Third Location - 107,West 20th Street,Manhattan - New York' },
];
const idList = [60, 1453, 1456];

const idLookup = new Set(itemList.map(({ id }) => id));
const listOfNonMatchingIds = idList.filter(id => !idLookup.has(id));

console.info({ listOfNonMatchingIds });
.as-console-wrapper { min-height: 100%!important; top: 0; }