Javascript 使用Lodash groupby和map变换对象数组

Javascript 使用Lodash groupby和map变换对象数组,javascript,lodash,Javascript,Lodash,下面是我要做的,我想把下面的数组转换成后面的数组。谁能给我指出正确的方向吗 原始数据 [{ "FeatureId": 1, "District": "ANE", "Temperature": 206, "RelativeHumidity": 20, "WindSpeed": 5, "WindGust": 15 }, { "FeatureId": 1,

下面是我要做的,我想把下面的数组转换成后面的数组。谁能给我指出正确的方向吗

原始数据

[{
        "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 ]
  },

]

我曾尝试将groupby和map结合起来,但无法解决该问题。我也不确定如何记录这些步骤。

让我们使用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)

让我们使用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)

Christian,欢迎来到StackOverflow

你有一个有趣的多步骤逻辑问题。我假设每个FeatureId可能不止2个,事实上,我假设每个FeatureId可能有1…n个

我将首先使用forEach循环来创建一个包含所有唯一FeatureId值的数组。然后,现在知道了这些值是什么,我将使用它创建一个新数组,其中只包含那些具有相同FeatureId的对象

由于这些工作数组中的所有元素都具有相同的FeatureId,因此最后一步,即组合对象,将更加容易。如果只有一个观察对象,则可以将现有对象推送到最终完成的阵列上。如果有>1个观察对象,则可以使用组合逻辑将新的连接对象推送到最终完成的数组中


您使用lodash map的想法是正确的,但我看您是否可以在没有lodash的情况下使用它,2我认为过滤器和forEach的组合将更适合您。

Christian,欢迎使用StackOverflow

你有一个有趣的多步骤逻辑问题。我假设每个FeatureId可能不止2个,事实上,我假设每个FeatureId可能有1…n个

我将首先使用forEach循环来创建一个包含所有唯一FeatureId值的数组。然后,现在知道了这些值是什么,我将使用它创建一个新数组,其中只包含那些具有相同FeatureId的对象

由于这些工作数组中的所有元素都具有相同的FeatureId,因此最后一步,即组合对象,将更加容易。如果只有一个观察对象,则可以将现有对象推送到最终完成的阵列上。如果有>1个观察对象,则可以使用组合逻辑将新的连接对象推送到最终完成的数组中


您使用lodash map的想法是正确的,但是我看您是否可以在没有lodash的情况下使用它,2我认为filter和forEach的组合将更适合您。

除了其他好的答案外,您还可以使用es6解构

var arr=[{ 特征:1, 地区:东区, 温度:206, 相对湿度:20, 风速:5,, 阵风:15 }, { 特征:1, 地区:东区, 温度:196度, 相对湿度:19, 风速:5,, 阵风:15 }, { 特征:2, 地区:古物古迹办事处,, 温度:203,, 相对湿度:54, 风速:9,, 阵风:18 }, { 特征:2, 地区:古物古迹办事处,, 温度:184度, 相对湿度:46, 风速:12,, 阵风:18 }] var temp=arr.reduceo,d=> {风速、阵风、相对湿度、温度等}= { D , ...{ 相对湿度趋势:o[d.FeatureId]&&o[d.FeatureId]。相对湿度趋势| |[]。浓度。相对湿度 ,WindSpeedTrend:o[d.FeatureId]&&o[d.FeatureId]。WindSpeedTrend | |[]concatd.WindSpeed ,WindGustTrend:o[d.FeatureId]&&o[d.FeatureId]。WindGustTrend | |[]concatd.WindGust ,TemperatureTrend:o[d.FeatureId]&&o[d.FeatureId]。TemperatureTrend | |[]concatd.Temperature } } ,o[d.FeatureId]=剩余 ,o , {} var result=Object.valuestemp
除了其他好的答案之外,您还可以使用es6解构

var arr=[{ 特征:1, 地区:东区, 温度:206, 相对湿度:20, 风速:5,, 阵风:15 }, { 特征:1, 地区:东区, 温度:196度, 相对湿度:19, 风速:5,, 阵风:15 }, { 特征:2, 地区:古物古迹办事处,, 温度:203,, 相对湿度:54, 风速:9,, 阵风:18 }, { 特征:2, 发行 ict:AMO, 温度:184度, 相对湿度:46, 风速:12,, 阵风:18 }] var temp=arr.reduceo,d=> {风速、阵风、相对湿度、温度等}= { D , ...{ 相对湿度趋势:o[d.FeatureId]&&o[d.FeatureId]。相对湿度趋势| |[]。浓度。相对湿度 ,WindSpeedTrend:o[d.FeatureId]&&o[d.FeatureId]。WindSpeedTrend | |[]concatd.WindSpeed ,WindGustTrend:o[d.FeatureId]&&o[d.FeatureId]。WindGustTrend | |[]concatd.WindGust ,TemperatureTrend:o[d.FeatureId]&&o[d.FeatureId]。TemperatureTrend | |[]concatd.Temperature } } ,o[d.FeatureId]=剩余 ,o , {} var result=Object.valuestemp console.logresult