Преобразование массива объекта с использованием Lodash groupby и map - PullRequest
0 голосов
/ 24 октября 2018

Вот что я хочу сделать, я хочу взять следующий массив и превратить его в массив после него.Может ли кто-нибудь указать мне правильное направление?

Исходные данные

[{
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 206,
        "RelativeHumidity": 20,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 196,
        "RelativeHumidity": 19,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 203,
        "RelativeHumidity": 54,
        "WindSpeed": 9,
        "WindGust": 18
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 184,
        "RelativeHumidity": 46,
        "WindSpeed": 12,
        "WindGust": 18
      }]

Мои желаемые данные:

[
  {
    "FeatureId": 1,
    "District": "ANE",
    "TemperatureTrend": [ 206, 196 ],
    "RelativeHumidityTrend": [ 20, 19 ],
    "WindSpeedTrend": [ 5, 5 ],
    "WindGustTrend": [ 15, 15 ]
  },
  {
    "FeatureId": 2,
    "District": "AMO",
    "TemperatureTrend": [ 203, 184 ],
    "RelativeHumidityTrend": [ 54, 46 ],
    "WindSpeedTrend": [ 9, 12 ],
    "WindGustTrend": [ 18, 18 ]
  },

]

Я пытался объединить групповую и карту, но я былне удалось решить проблему.Я также не был уверен, как регистрировать шаги.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Кристиан, добро пожаловать в StackOverflow!

У вас интересная многошаговая логическая проблема.Я предполагаю, что у вас может быть больше, чем 2 из каждого FeatureId, и на самом деле я предполагаю, что вы можете иметь где-нибудь от 1 ... n FeatureId.

Я бы сначала использовал цикл forEach для создания массивавсех ваших уникальных значений FeatureId.Затем, теперь, зная, что это за значения, я бы использовал фильтр JavaScript , чтобы создать новый массив, содержащий только те объекты с одинаковым FeatureId.

Последний шаг, объединяющий объекты, будетТеперь гораздо проще, когда все элементы в этих «рабочих массивах» имеют одинаковый FeatureId.Если существует только один объект наблюдения, вы можете поместить существующий объект в окончательный законченный массив.Если существует> 1 объект наблюдения, то вы можете использовать свою объединяющую логику и поместить новый объединенный объект в свой окончательный, законченный массив.

Ваша идея использования карты Лодаша движется в правильном направлении, но 1)посмотрите, сможете ли вы сделать это без Lodash и 2) Я думаю, что комбинация filter и forEach будет работать для вас лучше.

0 голосов
/ 24 октября 2018

Помимо других хороших ответов, вы также можете использовать деструктуру es6.

var arr = [{
            "FeatureId": 1,
            "District": "ANE",
            "Temperature": 206,
            "RelativeHumidity": 20,
            "WindSpeed": 5,
            "WindGust": 15
          },
          {
            "FeatureId": 1,
            "District": "ANE",
            "Temperature": 196,
            "RelativeHumidity": 19,
            "WindSpeed": 5,
            "WindGust": 15
          },
          {
            "FeatureId": 2,
            "District": "AMO",
            "Temperature": 203,
            "RelativeHumidity": 54,
            "WindSpeed": 9,
            "WindGust": 18
          },
          {
            "FeatureId": 2,
            "District": "AMO",
            "Temperature": 184,
            "RelativeHumidity": 46,
            "WindSpeed": 12,
            "WindGust": 18
          }]

var temp = arr.reduce((o, d) => (
              { WindSpeed, WindGust, RelativeHumidity, Temperature, ...rest } =
                    ({ 
                       ...d
    		      , ...{ 
		          RelativeHumidityTrend:  (o[d.FeatureId] && o[d.FeatureId].RelativeHumidityTrend || []).concat(d.RelativeHumidity)
		       	  , WindSpeedTrend:  (o[d.FeatureId] && o[d.FeatureId].WindSpeedTrend || []).concat(d.WindSpeed)
     	       		  , WindGustTrend:  (o[d.FeatureId] && o[d.FeatureId].WindGustTrend || []).concat(d.WindGust) 
                          , TemperatureTrend:  (o[d.FeatureId] && o[d.FeatureId].TemperatureTrend || []).concat(d.Temperature)
			}
    		})
    	        , o[d.FeatureId] = rest
   	        , o
    	   ) , {})
              
    var result = Object.values(temp)
    console.log(result)
0 голосов
/ 24 октября 2018

Позволяет использовать Array.prototype.reduce, потому что он соответствует цели того, что вы пытаетесь сделать.

    const data = [{
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 206,
        "RelativeHumidity": 20,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 196,
        "RelativeHumidity": 19,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 203,
        "RelativeHumidity": 54,
        "WindSpeed": 9,
        "WindGust": 18
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 184,
        "RelativeHumidity": 46,
        "WindSpeed": 12,
        "WindGust": 18
      }]

// we gonna create from scratch array and populate it
const aggregatedData = data.reduce((memo, element) => {
  const featureId = element.FeatureId

  const elementIndex = memo.findIndex(el => el.FeatureId === featureId)
  if (elementIndex === -1) {
    memo.push({
      FeatureId: featureId,
      District: element.District,
      TemperatureTrend: [element.Temperature],
      RelativeHumidityTrend: [element.RelativeHumidity],
      WindSpeedTrend: [element.WindSpeed],
      WindGustTrend: [element.WindGust]
    })
  } else {
    memo[elementIndex].TemperatureTrend.push(element.Temperature)
    memo[elementIndex].RelativeHumidityTrend.push(element.RelativeHumidity)
    memo[elementIndex].WindSpeedTrend.push(element.WindSpeed)
    memo[elementIndex].WindGustTrend.push(element.WindGust)
  }

  return memo
}, [])

console.log(aggregatedData)

Вы можете проверить это в codepen

...