Как отобразить элементы массива в JavaScript

0

Вопрос

В массиве должны храниться только элементы, значение которых превышает или равно пороговому значению. Затем необходимо будет создать новый массив, который будет содержать несколько объектов. Каждый из этих объектов будет иметь два свойства: начало и конец.

Если в строке несколько элементов (с интервалом в 10 минут), они будут сгруппированы в один и тот же объект. Где начальное значение будет меткой времени первого элемента, а конечное значение будет значением метки времени последнего элемента группы плюс 10 минут.

Если за ними не следует несколько элементов, начальным значением будет отметка времени, а конечным-отметка времени плюс 10 минут.

const data = [{
    timestamp: '2021-11-23T14:00:00+0000',
    amount: 21
  },
  {
    timestamp: '2021-11-23T14:10:00+0000',
    amount: 27
  },
  {
    timestamp: '2021-11-23T14:20:00+0000',
    amount: 31
  },
  {
    timestamp: '2021-11-23T14:30:00+0000',
    amount: 29
  },
  {
    timestamp: '2021-11-23T14:40:00+0000',
    amount: 18
  },
  {
    timestamp: '2021-11-23T14:50:00+0000',
    amount: 17
  },
  {
    timestamp: '2021-11-23T15:00:00+0000',
    amount: 25
  },
  {
    timestamp: '2021-11-23T15:10:00+0000',
    amount: 21
  }
]

const threshold = 25
const aboveThreshold = data.filter(element => element.amount >= threshold)
const workSchedule = []

for (let i = 0; i < aboveThreshold.length; i++) {
  if (i === 0) {
    workSchedule.push({
      start: aboveThreshold[i].timestamp,
      end: aboveThreshold[i + 1].timestamp
    })
  }
  if (i > 0 && i < aboveThreshold.length - 1) {
    if (aboveThreshold[i].timestamp.slice(11, 13) === aboveThreshold[i + 1].timestamp.slice(11, 13)) {
      workSchedule.push({
        start: aboveThreshold[i].timestamp,
        end: aboveThreshold[i + 1].timestamp
      })
    }
  }
  if (i === aboveThreshold.length - 1) {
    workSchedule.push({
      start: aboveThreshold[i].timestamp,
      end: aboveThreshold[i].timestamp
    })
  }
}

console.log(workSchedule)

Но конечный результат, которого я хочу, заключается в следующем:

[
    {
        start: '2021-11-23T14:10:00+0000',
        end: '2021-11-23T14:40:00+0000'
    },
    {
        start: '2021-11-23T15:00:00+0000',
        end: '2021-11-23T15:10:00+0000'
    }
]

Я надеюсь, что я был ясен

arrays javascript typescript
2021-11-23 20:24:54
1

Лучший ответ

1

Вы можете применить простую функцию уменьшения, чтобы получить желаемый результат, с небольшой помощью Date объект. Вот решение:

const aboveThreshold = data.filter(element => element.amount >= threshold);

const nws = aboveThreshold.reduce((acc, v) => {
  const end = new Date(Date.parse(v.timestamp) + 600000);
  if (acc.length === 0) return [{ start: v.timestamp, end: end.toISOString() }];
  let diff = Date.parse(v.timestamp) - Date.parse(acc[acc.length - 1].end);
  // checks if the difference is less than 10 minutes
  if (diff <= 10 * 60 * 1000) {
    acc[acc.length - 1].end = end.toISOString();
  } else {
    acc.push({ start: v.timestamp, end: end.toISOString() });
  }
  return acc
}, []);

Ознакомьтесь с документацией по сокращению.

Это результат, который он дает с вашими данными

[{
  end: "2021-11-23T14:40:00.000Z",
  start: "2021-11-23T14:10:00+0000"
}, {
  end: "2021-11-23T15:10:00.000Z",
  start: "2021-11-23T15:00:00+0000"
}]
2021-11-23 22:14:24

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................