删除数组中的重复项,但添加一个计数属性以查看重复项的数量
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);
【讨论】:
以上是关于删除数组中的重复项,但添加一个计数属性以查看重复项的数量的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 计算对象数组中的重复项并将计数存储为新对象