请问大家,我有这样一组数据如何转化成这样的

[
    {
        "name": "金额(元)",
        "month_1": "297",
        "month_2": "808",
        "month_3": "944",
        "month_4": "719",
        "month_5": "61500",
        "month_6": "794",
        "month_7": "819",
        "month_8": "552",
        "month_9": "714",
        "month_10": "760",
        "month_11": "101",
        "month_12": "171",
        "LAY_TABLE_INDEX": 0
    },
    {
        "name": "订单数",
        "month_1": "9",
        "month_2": "7",
        "month_3": "7",
        "month_4": "9",
        "month_5": "520",
        "month_6": "10",
        "month_7": "6",
        "month_8": "6",
        "month_9": "10",
        "month_10": "6",
        "month_11": "10",
        "month_12": "6",
        "LAY_TABLE_INDEX": 1
    },
    {
        "name": "拜访数",
        "month_1": "5",
        "month_2": "5",
        "month_3": "2",
        "month_4": "2",
        "month_5": "10",
        "month_6": "10",
        "month_7": "7",
        "month_8": "10",
        "month_9": "2",
        "month_10": "2",
        "month_11": "10",
        "month_12": "1",
        "LAY_TABLE_INDEX": 2
    }
]

转化成这样:

[
    {
        "month":1,
        "amount":"61500", //金额
        "order_num":"520", //订单数
        "visit_num":"10"   //拜访数
    },
    {
        "month":2,
        "amount":"61500", //金额
        "order_num":"520", //订单数
        "visit_num":"10"   //拜访数
    },
    {
        "month":3,
        "amount":"61500", //金额
        "order_num":"520", //订单数
        "visit_num":"10"   //拜访数
    },
    .....
]
阅读 922
1 个回答

源数据保存在 data 中,那么

// 加个中文到英文的配置
const i18n = {
    "amount": "金额(元)",
    "order_num": "订单数",
    "visit_num": "拜访数",
};

// 先按名称拆分,处理成映射表(对象)
const dataMap = Object.fromEntries(
    data.map(it => [it.name, it])
);

// 然后按 12 个月来处理,先生成 12 个月的数组
const result = [...Array(12)]
    .map((_, i) => {
        const month = i + 1;
        // 对每个月,产生一个对象
        return {
            // 先是有 month 属性
            month,
            // 再是有从 i18n 的 key 生成的属性
            ...Object.fromEntries(
                // 从 i18n 的 key 和 value 来映射键值对
                Object.entries(i18n)
                    .map(([en, zh]) => {
                        // 按中文名取分组对象(也就是原数组的对应元素)
                        const group = dataMap[zh];
                        // 键是 i18n 的英文部分
                        // 值是 从 group 里按月取出来的值
                        return [en, group[`month_${month}`]];
                    })
            )
        };
    });

后面生成 result 的部分,如果去掉注释,再稍加合并处理,其实也挺简单的

function createByMonth(month) {
    const entries = Object.entries(i18n).map(([en, zh]) => [en, dataMap[zh][`month_${month}`]]);
    entries.unshift(["month", month]);
    return Object.fromEntries(entries);
}

const result = [...Array(12)].map((_, i) => createByMonth(i + 1));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题