首页 > 解决方案 > 从对象数组中删除重复的对象副本

问题描述

我有一组从 API 获得的对象。属性名称是动态的(这意味着我没有一个完整的列表)。如何获得所有不同对象的数组?合约规定,如果键相等,值也相等。我试图环顾四周,但没有发现与这个问题完全一样的问题。

[                                                                                                                                                                                           20:31:28
  {
    'product-management': 'Product management'
  },
  {
    'product-development': 'Product development'
  },
  {
    'client-work': 'Client work'
  },
  {
    'client-work': 'Client work'
  },
  {
    'product-development': 'Product development'
  },
  {
    'client-work': 'Client work'
  },
  {
    'product-development': 'Product development'
  }
]

标签: ecmascript-6

解决方案


将数组传播到Object.assign()以将所有对象合并为一个对象。由于所有对象的属性都是唯一的,这将只从重复项中留下一个键(和值)。然后用 转换为 [key, value] 对Object.entries(),并映射回单个对象:

const data = [{"product-management":"Product management"},{"product-development":"Product development"},{"client-work":"Client work"},{"client-work":"Client work"},{"product-development":"Product development"},{"client-work":"Client work"},{"product-development":"Product development"}]

const result = Object.entries(Object.assign({}, ...data))
  .map(([k, v]) => ({ [k]: v }))
  
console.log(result)

根据@Bergi 的建议,您还可以在删除重复项的同时将其转换为更健全的 API:

const data = [{"product-management":"Product management"},{"product-development":"Product development"},{"client-work":"Client work"},{"client-work":"Client work"},{"product-development":"Product development"},{"client-work":"Client work"},{"product-development":"Product development"}]

const result = Object.entries(Object.assign({}, ...data))
  .map(([key, value]) => ({ key, value }))
  
console.log(result)


推荐阅读