删除数组中的重复项,但添加一个计数属性以查看重复项的数量

Posted

技术标签:

【中文标题】删除数组中的重复项,但添加一个计数属性以查看重复项的数量【英文标题】:Delete duplicates in an array but add a count property to see the number of duplicates 【发布时间】:2021-12-18 09:27:09 【问题描述】:

基本上如果我有这个数组:

["id" = 1, "product" = "Book", "id" = 1, "product" = "Book", "id" = 1, "product" = "Book", "id" = 2, "product" = "Chair"]

它会变成这个数组:

 ["id" = 1, "product" = "Book", "count" = 3, "id" = 2, "product" = "Chair", "count" = 1]

我正在使用反应。我的另一个选择是在创建和添加到数组时添加 count 属性,这样就不会添加重复项,但我很好奇是否有办法使用现有数组。

编辑: 如果两个产品具有相同的 id,则它们是重复的。

我尝试使用 id 过滤数组,然后获取第一个对象。我再次按 id 过滤数组以获得长度。然后我向第一个对象添加了一个新属性“count”,它是过滤数组的长度,之后我将第一个对象添加到一个新数组中。 这样做的问题是我必须为每个可能的 id 硬编码,即使它不包含在我的数组中。

【问题讨论】:

你已经尝试了什么?什么算作重复? ***.com/help/minimal-reproducible-example @DrewReese 编辑了我的帖子并回答了您的问题。 仅供参考,javascript 对象键/值的定义类似于 key: value不是 key = value 【参考方案1】:

将数组缩减为以id 为键的Map(甚至只是一个普通对象)(假设这就是识别重复项所需的全部内容)。

该映射的值将是您所追求的数组。

const arr = ["id":1,"product":"Book","id":1,"product":"Book","id":1,"product":"Book","id":2,"product":"Chair"]

const zipped = Array.from(arr.reduce((map, o) => 
  // check if id already registered
  if (map.has(o.id)) 
    // increment count
    map.get(o.id).count++
   else 
    // otherwise, store the new object with count starting at 1
    map.set(o.id,  ...o, count: 1 )
  
  return map
, new Map()).values())

console.log(zipped)
.as-console-wrapper  max-height:100% !important; 

【讨论】:

【参考方案2】:

您可以通过添加count 属性将数组缩减为一个新数组。假定id 属性足以考虑唯一性。如果元素已经被看到,则增加count,否则追加一个新的增强元素对象。

const data = [
  "id": 1,
  "product": "Book"
, 
  "id": 1,
  "product": "Book"
, 
  "id": 1,
  "product": "Book"
, 
  "id": 2,
  "product": "Chair"
];

const dedupedData = data.reduce((data, el) => 
  const index = data.findIndex(item => item.id === el.id);
  if (index !== -1) 
    data[index].count++;
   else 
    data.push( ...el, count: 1 );
  
  return data;
, []);

console.log(dedupedData);

【讨论】:

以上是关于删除数组中的重复项,但添加一个计数属性以查看重复项的数量的主要内容,如果未能解决你的问题,请参考以下文章

Ios Swift:删除图像数组中的重复项

Javascript - 计算对象数组中的重复项并将计数存储为新对象

从数组中删除重复的对象

NSSet 在使用 SetWithArray 时如何比较数组中的值以删除重复项

从 C++ 中的排序数组中删除重复项

从 BigQuery 中的数组中删除重复项