Вот что я хочу сделать, я хочу взять следующий массив и превратить его в массив после него. Может кто-то указать мне верное направление?
Исходные данные
[{
"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)
Помимо других хороших ответов, вы можете также использовать деструкцию 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)
Христианин, добро пожаловать в StackOverflow!
У вас есть интересная многоступенчатая логическая проблема. Я предполагаю, что у вас может быть не более двух из каждого FeatureId, и на самом деле я предполагаю, что у вас может быть от 1... n от FeatureId.
Сначала я бы использовал цикл forEach, чтобы создать массив всех ваших уникальных значений FeatureId. Затем, зная, каковы эти значения, я бы использовал фильтр JavaScript для создания нового массива, который содержит только те объекты с тем же FeatureId.
Последний шаг, объединив объекты, станет намного проще, если все элементы в этих "рабочих массивах" будут иметь тот же FeatureId. Если есть только один объект наблюдения, вы можете подтолкнуть существующий объект к окончательному, законченному массиву. Если есть> 1 объект наблюдения, то вы можете использовать свою логику комбинирования и нажимать новый конкатенированный объект на свой окончательный, законченный массив.
Ваша идея использования карты lodash направляется в правильном направлении, но 1) посмотрите, можете ли вы сделать это без Lodash и 2) Я думаю, что комбинация фильтра и forEach будет работать лучше для вас.