基于先前值的Javascript过滤器

时间:2018-10-11 16:41:03

标签: javascript arrays filter ecmascript-6

我试图在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;

必须有一种更好的方法。我曾想过使用箭头功能,但是在迭代时看不到如何访问上一个数组项对象的时间戳。

2 个答案:

答案 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
});