What is the most efficient way to convert the data below in node.js? Any help would be much appreciated. Thanks!
I have some data that looks like this->
inputdata = {
data1: [5.0, 10.0, 50.0, 100.0, 500.0],
data2: [5.0, 10.0, 50.0, 100.0, 500.0],
data3: [5.0, 10.0, 50.0, 100.0, 500.0]
}
and I need to convert it into this->
outputdata = [
{data1: 5.0, data2: 5.0, data3: 5.0},
{data1: 10.0, data2: 10.0, data3: 10.0},
{data1: 50.0, data2: 50.0, data3: 50.0},
{data1: 100.0, data2: 100.0, data3: 100.0},
{data1: 500.0, data2: 500.0, data3: 500.0}
]
Code attempt-->
var inputdata = {
data1: [5.0, 10.0, 50.0, 100.0, 500.0],
data2: [5.0, 10.0, 50.0, 100.0, 500.0],
data3: [5.0, 10.0, 50.0, 100.0, 500.0]
}
var outputdata = [];
Object.keys(inputdata).forEach(key => {
let value = inputdata [key];
if (key == "data1"){
for (let i = 0; i < value.length; i ) {
outputdata.push({data1: 0, data2: 0, data3: 0})
}
}
}
Object.keys(inputdata).forEach(key => {
let value = inputdata [key];
if (key == "data1"){
for (let i = 0; i < value.length; i ) {
outputdata[i].data1 = value[i];
}
}
if (key == "data2"){
for (let i = 0; i < value.length; i ) {
outputdata[i].data2 = value[i];
}
}
if (key == "data3"){
for (let i = 0; i < value.length; i ) {
outputdata[i].data3 = value[i];
}
}
}
console.log(inputdata);
console.log(outputdata);
CodePudding user response:
You could transpose the data and build new objects from data.
const
data = { data1: [5, 10, 50, 100, 500], data2: [5, 10, 50, 100, 500], data3: [5, 10, 50, 100, 500] },
result = Object
.entries(data)
.reduce((r, [k, a]) => a.map((v, i) => ({ ...r[i], [k]: v })), []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
CodePudding user response:
// reducer functions which transposes
// a table into a matrix and vice versa.
function transpose(result, row) {
return row.reduce((matrix, value, idx) => {
(matrix[idx] ??= []).push(value);
return matrix;
}, result);
}
const inputdata = {
data1: [5.0, 10.0, 50.0, 100.0, 500.0],
data2: [5.0, 10.0, 50.0, 100.0, 500.0],
data3: [5.0, 10.0, 50.0, 100.0, 500.0]
};
console.log(
Object
// convert `inputdata` into a table
// ... an array of row like arrays.
.values(inputdata)
);
console.log(
Object
// - convert `inputdata` into a table
// ... an array of row like arrays.
.values(inputdata)
// - then transpose the table into a matrix.
.reduce(transpose, [])
);
console.log(
Object
// - convert `inputdata` into a table
// ... an array of row like arrays.
.values(inputdata)
// - then transpose the table into a matrix.
.reduce(transpose, [])
// - then convert/map matrix
// into an array of objects.
.map(vector =>
vector.reduce((object, value, idx) =>
Object.assign(object, {
[`data${ idx 1 }`]: value,
}), {}
)
)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }