Массив объектов JS, группировка значений по метке времени - PullRequest
1 голос
/ 15 апреля 2019

У меня есть массив объектов, таких как:

var arr = 
[{timestamp: "2019-04-15T11:00:00.000Z", value:true},
{timestamp: "2019-04-15T12:00:00.000Z", value: false},
{timestamp: "2019-04-15T13:00:00.000Z", value: true},
{timestamp: "2019-04-15T14:00:00.000Z", value: true},
{timestamp: "2019-04-15T15:00:00.000Z", value: true},
{timestamp: "2019-04-15T16:00:00.000Z", value: false},
{timestamp: "2019-04-15T17:00:00.000Z", value: true},
{timestamp: "2019-04-15T18:00:00.000Z", value: true}...] etc

за 24 часа. Мне нужно показать время для начала и окончания истинного значения, из значения false должна быть отдельная группа раз:

Для эксп .: Время работы: 11, 13-15, 17-18.

можно ли сортировать как этот массив?

В настоящее время я получаю массив, как это: Время работы: 11, 13, 14, 15, 16, 17, 18.

const onValues = arr.filter(item => item.output === true );
const onValuesTimes = onValues.map(a => (moment(a.timestamp).format('HH:mm')));

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы можете взять временную метку для значений и построить начальные и конечные элементы, присоединиться к этим элементам и присоединиться к результату.

var array = [{ timestamp: "2019-04-15T11:00:00.000Z", value: true }, { timestamp: "2019-04-15T12:00:00.000Z", value: false }, { timestamp: "2019-04-15T13:00:00.000Z", value: true }, { timestamp: "2019-04-15T14:00:00.000Z", value: true }, { timestamp: "2019-04-15T15:00:00.000Z", value: true }],
    result = array
        .reduce((r, b, i, { [i - 1]: a }) => {
            if (!b.value) return r;
            if (a && a.value) {
                r[r.length - 1][1] = b.timestamp.slice(11, 16);
            } else {
                r.push([b.timestamp.slice(11, 16)]);
            }
            return r;
        }, [])
    .map(a => a.join('-'))
    .join(', ');

console.log(result);
0 голосов
/ 15 апреля 2019

Бесстыдный плагин: Вы можете использовать мою библиотеку ts-iterable-functions : Для этого

создана функция groupAdjacent

const {pp, groupAdjacent, _map, map, _count, _single, _first, _last, filter} = 
   tsIterableFunctions
var arr = [
  {timestamp: "2019-04-15T11:00:00.000Z", value: true},
  {timestamp: "2019-04-15T12:00:00.000Z", value: false},
  {timestamp: "2019-04-15T13:00:00.000Z", value: true},
  {timestamp: "2019-04-15T14:00:00.000Z", value: true},
  {timestamp: "2019-04-15T15:00:00.000Z", value: true},
  {timestamp: "2019-04-15T16:00:00.000Z", value: false},
  {timestamp: "2019-04-15T17:00:00.000Z", value: true},
  {timestamp: "2019-04-15T18:00:00.000Z", value: true}
]

const q=pp(
  arr,
  groupAdjacent(
    x => x.value,
    x => x,
    (key,elements) => ({
      key,
      values : _map(elements, e => moment(e.timestamp).utc().hour())
    })
  ),
  filter(x => x.key), // == true
  map(
      x => `${ _first(x.values) }-${ _last(x.values) + 1 }`
  )
)
console.log([...q])
<script src="https://cdn.jsdelivr.net/npm/ts-iterable-functions"></script>
<script src="https://cdn.jsdelivr.net/npm/moment"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...