使用值数组创建对象数组

Sur*_*esh 5 javascript

我有很多这种形式的数据

A B C D
-------
1 2 3 4
5 6 7 8
9 1 2 3
Run Code Online (Sandbox Code Playgroud)

使用javascript类型表示为:

df = {A: [1,5,9], B: [2,6,1], C: [3,7,2], D:[4,8,3]}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为以下形式:

[{A:1, B:2, C:3, D:4}, {A:5, B:6, C:7, D:8}, {A:9, B:1, C:2, D:3}]
Run Code Online (Sandbox Code Playgroud)

我尝试将其实现为:

keyes = ["A", "B", "C", "D"]
getrow = (i) => Object.assign( ...keyes.map((k) => ({[k]: df[k][i]})))
df.A.map( (x,j) => getrow(j))
Run Code Online (Sandbox Code Playgroud)

但这对于我拥有的表的大小来说很慢。有没有更快的方法可以做到这一点?

Nen*_*car 5

您可以使用reduceforEach循环来创建对象数组。

const df = {
  A: [1, 5, 9],
  B: [2, 6, 1],
  C: [3, 7, 2],
  D: [4, 8, 3]
}

const result = Object.keys(df).reduce((r, k) => {
  df[k].forEach((e, i) => {
    if (!r[i]) r[i] = {}
    r[i][k] = e;
  })
  return r;
}, [])

console.log(result)
Run Code Online (Sandbox Code Playgroud)

或者为了获得更好的性能,您可以使用for循环。

const df = {
  A: [1, 5, 9],
  B: [2, 6, 1],
  C: [3, 7, 2],
  D: [4, 8, 3]
}

const result = [];

for (let key in df) {
  for (let i = 0; i < df[key].length; i++) {
    if (!result[i]) result[i] = {}
    result[i][key] = df[key][i]
  }
}

console.log(result)
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 3

您可以使用两个 for 循环,并检查某个索引处的对象是否存在。然后将值分配给属性。

该版本比使用数组方法更快。

var data = { A: [1, 5, 9], B: [2, 6, 1], C: [3, 7, 2], D: [4, 8, 3] },
    result = [],
    key, values,
    i;
    
for ([key, values] of Object.entries(data)) {
    for (i = 0; i < values.length; i++) {
        if (!result[i]) result[i] = {};
        result[i][key] = values[i];
    }
}

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)