Слияние данных временных рядов - PullRequest
1 голос
/ 08 апреля 2019

Учитывая, что у меня есть два массива объектов, которые имеют следующую структуру:

  {
      avg: 195.6
      max: 195.6
      min: 195.6
      time: 1552448311000
    }

Теперь для примера: первый массив содержит данные для датчика температуры, а второй массив содержит данные для конкретной нагрузки двигателя. Чтобы построить эти данные, мне нужно, чтобы данные были в основном в следующем формате для каждой нарисованной точки: [нагрузка, температура], поэтому это график зависимости температуры от нагрузки.

Как я могу объединить эти два массива так, чтобы учитывались только точки, где есть соответствующая временная метка (пара)? Идея состоит в том, что я мог бы сделать что-то подобное в конце концов с одним объединенным массивом:

mergedArray.map(x => [x.load, x.avg])

Данные могут иметь различия в количестве данных, например, точек температуры может быть намного больше, чем точек нагрузки, поэтому мне нужно сначала отфильтровать данные температуры, чтобы включить только те точки, где есть соответствующая точка метки времени в серия нагрузки.

Пример данных:

const temperatureData = [
  {
    avg: 195.6,
    max: 195.6,
    min: 195.6,
    time: '1.1.2019'
  },
  {
    avg: 300,
    max: 300,
    min: 300,
    time: '1.2.2019'
  }
]

const loadData = [
  {
    avg: 195.6,
    max: 195.6,
    min: 195.6,
    time: '1.1.2019'
  }
]

const expected = [{
  avg: 195.6,
  max: 195.6,
  min: 195.6,
  time: '1.1.2019',
  load: 195.6
}]

поэтому были взяты только первые данные о температуре, поскольку в данных о нагрузке у них есть соответствующая отметка времени.

Один из лучших способов сделать это будет ниже, есть какие-либо отзывы?

    // First filter the load by set load filter
    const filteredLoad = load.filter(x => x.avg >= this.props.filter);

    // Collect the timestamps of the filtered load
    const loadTimeStamps = filteredLoad.map(x => x.time);

    const filteredTemperatures = temperaturData.filter(x => loadTimeStamps.includes(x.time))
    .map ((c, i) => {

      if (!filteredLoad[i]) return null;

      return {
        ...c,
        load: filteredLoad[i].avg
      }
    })

1 Ответ

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

Вы можете использовать циклы для фильтрации и объединения данных:

var newData = [];

for (var i = 0; i < temperatureData.length; i++) {
    for (var j = 0; j < loadData.length; j++) {
        if (temperatureData[i].time === loadData[j].time) {
            newData.push(temperatureData[i]);
            newData[newData.length - 1].load = loadData[j].avg
            j = loadData.length;
        }
    }
}

Демонстрация в реальном времени: http://jsfiddle.net/BlackLabel/9xsdqwct/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...