3 回答

TA貢獻1858條經驗 獲得超8個贊
如果我理解了這個問題,你可以用一行函數來解決它:
const test = [{
Time: new Date(1000),
psi: 100.0
},
{
Time: new Date(1000),
psi: 200.0
},
{
Time: new Date(2000),
psi: 200.0
}
]
const unique = test.filter(({Time}, i, array) =>
!array.find((item, j) => item.Time.getTime() === Time.getTime() && j > i));
console.log(unique);

TA貢獻1841條經驗 獲得超3個贊
function removeDuplicates(myArr, prop) {
return myArr.filter((obj, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
});
}
removeDuplicates(test,"Time")
使用 javascript 的過濾器功能,只返回唯一元素的列表。

TA貢獻1951條經驗 獲得超3個贊
該.indexOf()函數不適用于具有相同值的 Date 對象,因為每個對象仍然被認為是不同的,并且該.indexOf()函數將始終找到 Date 對象本身的索引,而不是另一個“副本”。為了克服這個問題,我在收集數組 ( tst) 中的值之前將 Date 對象轉換回毫秒。myArr.map(mapObj => mapObj[prop].getTime())在我進入.filter函數之前,我會這樣做。
由于該.getTime()方法僅適用于 Date 對象,因此將屬性保留為參數是沒有意義prop的。相反,我將.Time屬性硬編碼到代碼中。
編輯:
+通過使用屬性的一元運算符強制數字數據類型,.Time我可以省略.getTime()將隱式應用的方法。
var test = [{Time: new Date(1000), psi:100.0},
{Time: new Date(1000), psi:200.0},
{Time: new Date(2000), psi:200.0}];
function Cars10m_remDups(myArr) {
let tst=myArr.map(o=>+o.Time);
return myArr.filter((o, i)=>tst.indexOf(+o.Time)===i);
}
// for comparison: --> will list all three objects!
function Akin_remDups(myArr, prop) {
return myArr.filter((obj, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
});
}
// Zero's one-liner works too, here: my shortened version
const Zero_remDups = myArr => myArr.filter(({Time}, i, array) =>
!array.find((item, j) => +item.Time-Time==0&&i>j));
// also: with "i>j" I pick the first unique (Zero chose the last)
console.log('Cars10m:',Cars10m_remDups(test));
console.log('Akin:',Akin_remDups(test,"Time"));
console.log('Zero:',Zero_remDups(test));
.as-console-wrapper { max-height: 100% !important; top: 0; }
添加回答
舉報