使用map将数组合并为对象数组

时间:2019-03-25 13:42:58

标签: typescript object multidimensional-array ecmascript-6

我正在尝试将数组与值合并;

const headers = ["DATE", "FGH", "DCP", "MRK"];
const values = [["2019-06-12", 106, 125, 122 ], ["2019-06-14", 108, 128, 121]];

进入对象数组以获取最终输出:

[
  { DATE: "2019-06-12”, FGH: 106, DCP: 125, MRK: 122 },
  { DATE: "2019-06-14”, FGH: 108, DCP: 128, MRK: 121 }
]

使用.map方法;

this.mergedValues = this.values.map((val, i ) => 
  headers.map((headerVal, j) => ({
    [headerVal]: val[j]
  })))

但是标头的映射是错误的,因为它会将每个项目都放在对象中;

[ { DATE: "2019-06-12”}, {FGH: 106}, {DCP: 125}, {MRK: 122} ],
  ...
]

3 个答案:

答案 0 :(得分:1)

我将使用以下方式:

values.map((val, i ) => {
  let obj={};
  for(let i=0;i<header.length;i++){
        obj[header[i]]=val[i];
  }
  return obj;
})

答案 1 :(得分:1)

使用Array#reduce方法生成对象元素。

let mergedValues = values.map((val) => headers.reduce((obj, key, index) => Object.assign(obj, { [key]: val[index] }), {}));

const headers = ["DATE", "FGH", "DCP", "MRK"];
const values = [
  ["2019-06-12", 106, 125, 122],
  ["2019-06-14", 108, 128, 121]
];


let mergedValues = values.map((val) => headers.reduce((obj, key, j) => Object.assign(obj, {
  [key]: val[j]
}), {}));

console.log(mergedValues);

答案 2 :(得分:0)

我将像您所做的一样动态地解决它,但是将reduce作为最后一项。使用reduce,您可以在转换每个值数组的每个元素之后构造一个最终对象。

const headers = ["DATE", "FGH", "DCP", "MRK"];
const values = [["2019-06-12", 106, 125, 122 ], ["2019-06-14", 108, 128, 121]];

const result = values.map(value => 
  value.reduce((acc, data, index) => 
    ({...acc, [headers[index]]: data}), {}));

console.log(result)