我试图在ES6中重写一个函数,以对对象数组使用过滤。当前,代码循环遍历数组,并将满足条件的数组成员复制到新数组,然后返回该数组。条件基于数组中的先前值。我想过滤掉对象时间戳字段为<4分钟的所有数组项。
let final = [];
final.push(data[0]);
for (let i = 1, j = data.length; i < j; i++) {
// if time difference is > 4 minutes add to our final array
if (data[i].timestamp - data[i-1].timestamp > 240) {
final.push(data[i]);
}
}
return final;
必须有一种更好的方法。我曾想过使用箭头功能,但是在迭代时看不到如何访问上一个数组项对象的时间戳。
答案 0 :(得分:3)
Array.filter()
方法也可以使用索引(i
)。同样要考虑第一项,我使用条件!i
,当true
为0时,条件求值为i
。
const data = [{ timestamp: 1 }, { timestamp: 3 }, { timestamp: 250 }, { timestamp: 1000 }];
const final = data.filter((o, i) =>
!i || (o.timestamp - data[i-1].timestamp > 240)
);
console.log(final);
答案 1 :(得分:1)
let prevTs = -Infinity;
const result = data.filter((d) => {
const localResult = (d.timestamp - prevTs) > 240;
prevTs = d.timestamp;
return localResult;
});
或者您可以在过滤器回调中使用索引arg:
data.filter((d, i) => {
if (!i) {
return true;
}
return (d.timestamp - data[i - 1].timestamp) > 240
});