基本上如果我有這個陣列:
[{"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 對其進行硬編碼,即使它沒有包含在我的陣列中。
uj5u.com熱心網友回復:
將陣列減少為一個Map(甚至只是一個普通物件)鍵控id(假設這就是識別重復項所需的全部內容)。
該地圖的值將是您所追求的陣列。
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; }
uj5u.com熱心網友回復:
您可以將陣列減少為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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347348.html
標籤:javascript 数组 重复
