假設我有以下物件陣列:
[
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 3
},
{
status: 'Ordered',
order: 4
},
{
status: 'Sent',
order: 5
}
]
我想知道,我想對這個陣列中的物件進行重復資料洗掉,但只對具有重復狀態的“最舊”物件進行重復資料洗掉,也就是說,對于上述陣列,我想得到以下 de-欺騙陣列:
[
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 4
},
{
status: 'Sent',
order: 5
}
]
也就是說,狀態 Ordered 4 比狀態 Ordered 3 更“年輕”……而不僅僅是重復資料洗掉……這可以擴展到以下內容:
[
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 3
},
{
status: 'Ordered',
order: 4
},
{
status: 'Ordered',
order: 5
},
{
status: 'Confirmed',
order: 6
}
]
將導致:
[
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 5
},
{
status: 'Confirmed',
order: 6
}
]
注意 有一個警告,我實際上在物件中沒有 order 鍵,這純粹是為了演示目的,以證明我在這個問題上的意思..
uj5u.com熱心網友回復:
非常簡單的reduce函式。基本上我們創建一個物件(每個鍵只能有一個值)。陣列中具有特定狀態的“最后一個”條目將被保留。
const input = [
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 3
},
{
status: 'Ordered',
order: 4
},
{
status: 'Ordered',
order: 5
},
{
status: 'Confirmed',
order: 6
}
];
const output = Object.values(input.reduce((a, e) => {
a[e.status] = e;
return a;
}, {}));
console.log(output);
uj5u.com熱心網友回復:
帶地圖的單線:
const arr = [
{
status: 'Draft',
order: 1
},
{
status: 'Accepted',
order: 2
},
{
status: 'Ordered',
order: 3
},
{
status: 'Ordered',
order: 4
},
{
status: 'Ordered',
order: 5
},
{
status: 'Confirmed',
order: 6
}
];
const deduped = [...new Map(arr.map(o => [o.status, o])).values()];
console.log(deduped);
uj5u.com熱心網友回復:
JS 本身不包含 dedup/distinct 函式,因此您必須自己制作,例如使用過濾器檢查重復項
過濾器的標準回呼是(item, index, array)
這意味著你可以做
filter((item,idx,arr)=> arr.findIndex(other=>areEqual(item,other)) != idx)
這讀作洗掉它們以前存在于陣列中的所有元素,因為 findIndex 回傳第一個匹配的位置,所以如果它們當前索引不等于它,那么它不是第一個匹配
findindex 而不是 indexOf 的原因是 findIndex 允許您指定如何檢查相等性
這是areEqual回呼的來源,它需要2個專案,如果它們相等則回傳true
可能是這樣
areEqual(a,b){
return a.field === b.field
}
當然,這對于 a.field === b.field 來說太過分了,可以重寫為
filter((item,idx,arr)=> arr.findIndex(other=>item.field === other.field) != idx)
但是您指出您的相等性測驗可能比單個已知欄位更復雜,因此對 areEqual 的回呼允許更復雜的邏輯
不幸的是,沒有 findLastIndex,但只需在過濾之前反轉陣列即可解決此問題,然后反轉結果以重新獲得原始順序
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/453588.html
標籤:javascript
上一篇:地圖組件的自定義地圖示記/pin
下一篇:檢測重疊點的點擊事件位置
