машинопись: как получить объекты с одинаковыми значениями свойств, но разными ключами из двух разных наборов объектов - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно наборы Json полученных из формы данных о состоянии

objetSet1:
  {id: 12, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 23, name: 'Bar Foo', email: 'bar@foo.com'},
  {id: 61, name: 'Barbell', email: 'barbell@mail.com'},
  {id: 45, name: 'Joe Ocean', email: 'joe@ocean.com'}

objectSet2:
  {ObjectId:15, name: 'someone', email: 'someone@mail.com'},
  {ObjectId: 23, name: 'sometwo', email: 'sometwo@mail.com'},
  {ObjectId: 72, name: 'seven ', email: 'seven@mail.com'},
  {ObjectId: 23, name: 'five ', email: 'five@mail.com'}

Я на самом деле искал способ, чтобы это выражение было динамическим c

objectSet2 = objectSet2.filter(object => object.ObjectId === '23')

вместо значения 23 stati c, значение из objectSet1 соответствует

результат должен содержать Item с идентификаторами, присутствующими в первом наборе объектов

ожидаемый результат :

objectSet2:
      {ObjectId: 23, name: 'sometwo', email: 'sometwo@mail.com'},
      {ObjectId: 23, name: 'five ', email: 'five@mail.com'}

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Год назад был близок, просто нужно было добавить новый фильтр, подобный этому:

objetSet1 = [{id: 12, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 23, name: 'Bar Foo', email: 'bar@foo.com'},
  {id: 61, name: 'Barbell', email: 'barbell@mail.com'},
  {id: 45, name: 'Joe Ocean', email: 'joe@ocean.com'}];
  
  objectSet2 = [{ObjectId:15, name: 'someone', email: 'someone@mail.com'},
  {ObjectId: 23, name: 'sometwo', email: 'sometwo@mail.com'},
  {ObjectId: 72, name: 'seven ', email: 'seven@mail.com'},
  {ObjectId: 23, name: 'five ', email: 'five@mail.com'}];
  
 var result = objectSet2.filter((obj2)=>objetSet1.filter((obj1)=>obj1.id==obj2.ObjectId).length>0)
 
 console.log(result);

Обратите внимание obj1.id==obj2.ObjectId сравнение. Возвращается значение true, когда количество положительных совпадений на внутреннем фильтре больше нуля. Тогда это ответ для внешнего фильтра.

0 голосов
/ 27 февраля 2020

Это объединяет ответы Джонаса Уилмса и Иктуса таким образом, что я думаю, что это немного яснее, и я прокомментировал код для будущих читателей, чтобы узнать, что делается.

// Define Yoann Eddy's original two sets of objects, but as Arrays
let objectSet1 = [
  {id: 12, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 23, name: 'Bar Foo', email: 'bar@foo.com'},
  {id: 61, name: 'Barbell', email: 'barbell@mail.com'},
  {id: 45, name: 'Joe Ocean', email: 'joe@ocean.com'}
];

let objectSet2 = [
  {ObjectId:15, name: 'someone', email: 'someone@mail.com'},
  {ObjectId: 23, name: 'sometwo', email: 'sometwo@mail.com'},
  {ObjectId: 72, name: 'seven ', email: 'seven@mail.com'},
  {ObjectId: 23, name: 'five ', email: 'five@mail.com'}
];

// Get just the ID numbers from the first set
let ids = new Set(objectSet1.map(o => o.id));

// Filter the second set, keeping only the objects that have
// an object.ObjectId that is in the first set of IDs
let result = objectSet2.filter(o => ids.has(o.ObjectId));

console.log(result);

Все-в-одном линия Ictus выполняет свою работу, но ее будет сложнее поддерживать просто потому, что ее труднее понять коллеге (или вашему будущему я)

0 голосов
/ 27 февраля 2020

Вы можете создать набор идентификаторов из первого массива:

  const ids = new Set(objectSet1.map(object => object.id));

Затем вы можете проверить, что более влажные объекты из второго массива находятся в этом наборе

  ids.has(object.ObjectId)
...