打字稿:如何从两组不同的对象中获取具有相同 属性 值但键不同的对象

typescript: How to get objects with the same property values but different keys from 2 different sets of Objects

我必须从表单中获取一组 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'}

我实际上是在寻找一种方法让这个表达式成为动态的

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

不是23个静态值,是objectSet1对应的值

结果应包含第一个对象集上存在 ID 的项目

预期输出:

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

同比接近,只需要像这样添加一个新过滤器:

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。那么这就是外部过滤器的答案。

您可以从第一个数组创建一组 ID:

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

然后你可以检查第二个数组中的对象是否在那个集合中

  ids.has(object.ObjectId)

这以我认为更清晰的方式结合了 Jonas Wilms 和 Ictus 的回答,并且我对代码进行了注释,以便未来的读者了解正在做什么。

// 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 的一体化生产线可以完成这项工作,但会更难维护,因为它更难被同事(或你未来的自己)理解