Фильтр Javascript на основе предыдущего значения - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь переписать функцию в ES6, чтобы использовать фильтрацию по массиву объектов.В настоящее время код перебирает массив и копирует элементы массива, которые соответствуют критериям, в новый массив, который он затем возвращает.Критерии основаны на предыдущем значении в массиве.Я хочу отфильтровать все элементы массива, где поле метки времени объекта <4 минуты. </p>

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 голосов
/ 11 октября 2018

Метод Array.filter() также может использовать индекс (i).Чтобы взять 1-й предмет, я использую условие !i, которое оценивается как true, когда i равно 0.

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);
0 голосов
/ 11 октября 2018
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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...