大家好,我有這樣的場景:
const data = [
{
"name": "Hebert",
"timestamp": 1640371815, // 15:50:15
},{
"name": "Brien",
"timestamp": 1640373855, // 16:24:15
},{
"name": "Hebert",
"timestamp": 1640363601 // 13:33:21
},{
"name": "Mary",
"timestamp": 1640356701 // 11:38:21
},{
"name": "Mary",
"timestamp": 1640356521 // 11:35:21
},{
"name": "Mary",
"timestamp": 1640356401 // 11:33:21
}
];
我需要按時間戳從重復項中獲得最后一個:
// expected result
[
{
"name": "Hebert",
"timestamp": 1640371815 // 15:50:15 newest one
},{
"name": "Brien",
"timestamp": 1640373855 // 16:24:15 unique
},{
"name": "Mary",
"timestamp": 1640356701 // 11:38:21 newest
}
];
我試試這個:
data.sort((a,b) => a.name.localeCompare(b.name))
.filter((chat, index, self) => self.findIndex( c => c.name == chat.name ) == index )
輸出重復洗掉但不考慮每個重復之間的最新時間戳
uj5u.com熱心網友回復:
而不是排序和使用過濾器,您可以使用名稱作為鍵將專案存盤在 Map 或物件中一次迭代陣列,然后在回圈遍歷每個專案時更新最低時間戳。
然后最后將物件值轉換回陣列
const items = new Map()
data.forEach(({name,timestamp}) => {
const o = items.get(name);
if(o){
timestamp < o.timestamp && o.timestamp = timestamp;
} else {
items.set(name, {name, timestamp});
}
});
const res = [...items.values()]
console.log(res)
<script>
const data = [
{
"name": "Hebert",
"timestamp": 1640371815, // 15:50:15
},{
"name": "Brien",
"timestamp": 1640373855, // 16:24:15
},{
"name": "Hebert",
"timestamp": 1640363601 // 13:33:21
},{
"name": "Mary",
"timestamp": 1640356701 // 11:38:21
},{
"name": "Mary",
"timestamp": 1640356521 // 11:35:21
},{
"name": "Mary",
"timestamp": 1640356401 // 11:33:21
}
];
</script>
uj5u.com熱心網友回復:
const data = [
{
"name": "Hebert",
"timestamp": 1640371815, // 15:50:15
},{
"name": "Brien",
"timestamp": 1640373855, // 16:24:15
},{
"name": "Hebert",
"timestamp": 1640363601 // 13:33:21
},{
"name": "Mary",
"timestamp": 1640356701 // 11:38:21
},{
"name": "Mary",
"timestamp": 1640356521 // 11:35:21
},{
"name": "Mary",
"timestamp": 1640356401 // 11:33:21
}
];
const seen = {};
const dataModified = [];
data.forEach((elem) => {
const index = seen[elem.name];
if(index == undefined){
dataModified.push(elem);
seen[elem.name] = dataModified.length - 1;
} else if(dataModified[index].timestamp < elem.timestamp){
dataModified.splice(index, 1, elem);
}
});
console.log(dataModified);
uj5u.com熱心網友回復:
data.sort((a,b) => a.name.localeCompare(b.name))
.filter((chat, index, self) => self.findIndex(c => c.name === chat.name && c.timestamp > chat.timestamp)<0)
這個想法是 findIndex 只會在存在另一個具有更大時間戳的重復項時才回傳索引,否則它會回傳 -1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/392454.html
標籤:javascript
