js这种数据结构转换

这种数据结构如何变成数组包对象

data: {
"a": [{"key": " 2022-01-07","value": "0.5"},
         {"key": " 2022-01-14","value": "0.22"},], 
"b": [{"key": " 2022-01-07","value": "0.42"},
        {"key": " 2022-01-14","value": "0.32"},],
"c": [{"key": " 2022-01-07","value": "0.2"},
        {"key": " 2022-01-14","value": "0.3"},]
"d": [{"key": " 2022-01-07","value": "0.7"}] 
}, 

想要的

data: [
 {
"key": " 2022-01-07",
"value1": "0.5",
"value2":"0.42",
"value3": "0.2",
"value4": "0.7"
   },
   {
"key": " 2022-01-14",
"value1": "0.22",
"value2": "0.32",
"value3": "0.3",
"value4": "",
    },
], 
阅读 1.3k
2 个回答
// 如果 key 都一样,可以直接取出来
// const keys = data.a.map(({ key }) => key);

// 如果 key 不一定都一样,需要把所有 key 取出来去重
const keys = (data => {
    const all = Object.values(data).flatMap(arr => arr.map(({ key }) => key));
    return [...new Set(all)];
})(data);

const result = keys.map(key => ({ key }));
const map = Object.fromEntries(result.map(it => [it.key, it]));

Object.entries(data)
    .forEach(([, arr], i) => {
        arr.forEach(({ key, value }) => {
            map[key][`value${i + 1}`] = value;
        });
    });

console.log(result);

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
const rowsMap = {};
Object.values(data).map((column, index) => {
    column.map(row => {
        if (! rowsMap[row.key]) rowsMap[row.key] = {key: row.key};
        rowsMap[row.key][`value${index + 1}`] = row.value;
    }
};
const rows = Object.values(rowsMap);

使用的时候判断一下valueN是否存在就行了,因为强行补上虽然可以做,但是麻烦又没用。因为用什么值代替这个空属性也是你定的,那直接用这个值就好了,还费劲写进来再读干啥呢。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题