如何将仅包含数组值的对象转换为对象数组,每个对象都具有转置的 属性 值?

How to convert an object of just array values into an array of objects, each with transposed property values?

在node.js中转换以下数据的最有效方法是什么?任何帮助将非常感激。谢谢!

我有一些数据是这样的 ->

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],
};

我需要将它转换成这个 ->

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

代码尝试 ->

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],
};
const 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);

您可以转置数据并从数据构建新对象。

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; }

使用下面提供的分步示例代码的技术...

// reducer function 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; }