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