У меня есть такой объект:
let inputData = {
"dimensions": [
{
"id": "dimension_re",
"label": "Region",
"values": ["East", "East", "West", "SouthWest", "South","NorthEast"]
},
{
"id": "dimension_cnt",
"label": "County",
"values": ["London", "Italy", "Germany", "US", "Russia","India"]
},
{
"id": "measure_sales",
"label": "Sales",
"values": [100, 156, 432, 462, 25,100]
},
{
"id": "measure_qty",
"label": "Quantity",
"values": [85, 34, 153, 434, 52, 43]
},
{
"id": "measure_profit",
"label": "Profit",
"values": [123, 45, 421, 465, 451, 56]
}
]
}
Мой ожидаемый результат:
let expectdData = [
{
"Region": "East",
"County": "London",
"Sales": 100,
"Quantity": 85,
"Profit": 123
},
{
"Region": "East",
"County": "Italy",
"Sales": 156,
"Quantity": 34,
"Profit": 45
},
{
"Region": "West",
"County": "Germany",
"Sales": 432,
"Quantity": 153,
"Profit": 421
},
{
"Region": "SouthWest",
"County": "US",
"Sales": 462,
"Quantity": 434,
"Profit": 465
},
{
"Region": "South",
"County": "Russia",
"Sales": 25,
"Quantity": 52,
"Profit": 451
},
{
"Region": "NorthEast",
"County": "India",
"Sales": 100,
"Quantity": 43,
"Profit": 56
}
]
Вот моя программа для получения этих ожидаемых данных:
let actualData = [];
inputData.dimensions.forEach((e,i) => {
let tempVal = e.label;
e.values.forEach((elem,index) => {
actualData[index] = new Object({
[tempVal] : elem
});
})
});
console.log(actualData);
Но, к сожалению, я получаю только последний элемент для каждого объекта. В моей консоли это выглядит так:
[
{ Profit: 123 },
{ Profit: 45 },
{ Profit: 421 },
{ Profit: 465 },
{ Profit: 451 },
{ Profit: 56 }
]
Я думаю, что в каждой итерации он просто переопределяет переменную «tempVal». Как предотвратить это и как я могу получить ожидаемый массив объектов?
Вы заменяете весь объект на каждой итерации, вам просто нужно создать его, если он не существует, иначе вы можете заменить ключ.
let actualData = [];
inputData.dimensions.forEach((e,i)=>{
let tempVal = e.label;
e.values.forEach((elem,index) => {
if (!actualData[index]) {
actualData[index] = {}
}
actualData[index][tempVal] = elem
})
});
console.log(actualData);
Array#reduce
, выполните итерацию по dimension
при обновлении списка полученных объектов.Array#forEach
для перебора текущего списка values
и обновления объекта в каждом индексе с помощью label
в качестве ключа и текущего value
в качестве значения.const inputData = {
"dimensions": [
{
"id": "dimension_re",
"label": "Region",
"values": ["East", "East", "West", "SouthWest", "South","NorthEast"]
},
{
"id": "dimension_cnt",
"label": "County",
"values": ["London", "Italy", "Germany", "US", "Russia","India"]
},
{
"id": "measure_sales",
"label": "Sales",
"values": [100, 156, 432, 462, 25,100]
},
{
"id": "measure_qty",
"label": "Quantity",
"values": [85, 34, 153, 434, 52, 43]
},
{
"id": "measure_profit",
"label": "Profit",
"values": [123, 45, 421, 465, 451, 56]
}
]
};
const res = inputData.dimensions.reduce((acc, { label, values = [] }) => {
values.forEach((value, index) => {
acc[index] = { ...(acc[index] ?? {}), [label]: value };
});
return acc;
}, []);
console.log(res);
Поскольку ваш index
исходит из внутреннего цикла, вы будете заменять значения в actualData[index]
на каждой итерации внешнего цикла, поэтому вы получите только последнюю.
Вместо этого попробуйте эту операцию уменьшать...
const inputData = {"dimensions":[{"id":"dimension_re","label":"Region","values":["East","East","West","SouthWest","South","NorthEast"]},{"id":"dimension_cnt","label":"County","values":["London","Italy","Germany","US","Russia","India"]},{"id":"measure_sales","label":"Sales","values":[100,156,432,462,25,100]},{"id":"measure_qty","label":"Quantity","values":[85,34,153,434,52,43]},{"id":"measure_profit","label":"Profit","values":[123,45,421,465,451,56]}]};
// Find the max number of `values`
const maxLength = Math.max(...inputData.dimensions.map(({ values }) => values.length));
const actualData = inputData.dimensions.reduce(
(arr, { label, values }) =>
arr.map((obj, i) => ({ ...obj, [label]: values[i] })),
Array.from(
{
length: maxLength,
},
() => ({}) // creates an array of empty objects
)
);
console.log(actualData);
.as-console-wrapper { max-height: 100% !important; }
Большой ! На самом деле я не очень хорошо знал метод сокращения, но ваш ответ дает мне четкое представление об этом. благодарю вас