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; }
添加回答
举报