javascript 如何将多个具有相同构造的数组值Map到一个对象?

kxeu7u2r  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(77)

如何将嵌套数组的值Map到具有相同构造的对象模板?我已经尝试了一些方法,但仍然不能得到目标,有人可以帮我一个忙吗?这是我从后台得到的原始数据!

const test_array = [
        {
            "name": "AnyManagedFundsRow",
            "columnMeta": {
                "a0": "STRING",
                "a1": "STRING",
                "a2": "STRING",
                "a3": "DATE",
                "a4": "DATE",
                "a5": "DOUBLE",
                "a6": "INT"
            },
            "rows": [
                [
                    "华夏基金管理有限公司",
                    "华夏大中华企业精选灵活配置混合(QDII)",
                    "其他型基金",
                    "2016-01-20",
                    "",
                    21.877086009428236,
                    65135
                ],
                [
                    "华夏基金管理有限公司",
                    "华夏大盘精选混合",
                    "混合型基金",
                    "2015-09-01",
                    "2017-05-02",
                    10.307680340705128,
                    2944
                ]
            ]
        }
    ];

目标数据看起来像下面的结构!

let target_data = [
        {
            "A0": {
                "Description": "华夏基金管理有限公司",,
                "type": "STRING"
            },
            "A1": {
                "Description": "华夏大中华企业精选灵活配置混合(QDII)",
                "type": "STRING"
            },
            "A2": {
                "Description": "其他型基金",
                "type": "STRING"
            },
            "A3": {
                "Description": "2016-01-20",
                "type": "DATE"
            },
            "A4": {
                "Description": "",
                "type": "DATE"
            },
            "A5": {
                "Description": "21.877086009428236",
                "type": "DOUBLE"
            },
            "A6": {
                "Description": "65135",
                "type": "INT"
            }
        },
        {
            "A0": {
                "Description": "华夏基金管理有限公司",,
                "type": "STRING"
            },
            "A1": {
                "Description": "华夏大盘精选混合",
                "type": "STRING"
            },
            "A2": {
                "Description": "混合型基金",
                "type": "STRING"
            },
            "A3": {
                "Description": "2015-09-01",
                "type": "DATE"
            },
            "A4": {
                "Description": "2017-05-02",
                "type": "DATE"
            },
            "A5": {
                "Description": "10.307680340705128",
                "type": "DOUBLE"
            },
            "A6": {
                "Description": "2944",
                "type": "INT"
            }
        }
    ];

部分OK。如何使用索引来迭代对象?
c_obj[index] = value;

const test_array = [
        {
            "name": "AnyManagedFundsRow",
            "columnMeta": {
                "a0": "STRING",
                "a1": "STRING",
                "a2": "STRING",
                "a3": "DATE",
                "a4": "DATE",
                "a5": "DOUBLE",
                "a6": "INT"
            },
            "rows": [
                [
                    "华夏基金管理有限公司",
                    "华夏大中华企业精选灵活配置混合(QDII)",
                    "其他型基金",
                    "2016-01-20",
                    "",
                    21.877086009428236,
                    65135
                ],
                [
                    "华夏基金管理有限公司",
                    "华夏大盘精选混合",
                    "混合型基金",
                    "2015-09-01",
                    "2017-05-02",
                    10.307680340705128,
                    2944
                ]
            ]
        }
    ];

    const tabs_obj = {};

    const tabs = test_array.map(
        // tab
        (tab, index) => {
            let p_obj = {},
                c_obj = {};
            p_obj[tab.name] = [];
            // object keys length
            let key_length = Object.keys(tab.columnMeta).length;
            for (let key in tab.columnMeta) {
                let obj = {};
                if (tab.columnMeta.hasOwnProperty(key)) {
                    obj.type = tab.columnMeta[key];
                    obj.Description = "";
                    c_obj[key.toUpperCase()] = obj;
                    // "a0".toUpperCase(); === "A0"
                }
                console.log(`%c tabs${index} & c_obj[key.toUpperCase] = \n`, "color: #f0f", JSON.stringify(c_obj, null, 2));
                // c_obj = {"A0": ""}
            }
            let t_obj = {};
            for(let arr of tab.rows){
                arr.map(
                    (value, index) => {
                        // c_obj[index] = value;
                        t_obj[index] = value;
                        for(key in c_obj){
                            c_obj[key].Description = value;
                        } 
                    }
                );
            }
            p_obj[tab.name].push(c_obj);
            console.log("%c  \n\n finish a c_obj!  = \n\n", "color: red", JSON.stringify(c_obj, null, 4));
            // c_obj = {"A0": "","A1": "","A2": "",A3: "",A4: "", A5: "", A6: ""}
            return p_obj;
        }
    );

    // format JSON : JSON.stringify(c_obj, null, 4)`
qnakjoqk

qnakjoqk1#

您可以迭代这些值并将其Map到它们所分配的类型。

var test_array = [{ name: "AnyManagedFundsRow", columnMeta: { a0: "STRING", a1: "STRING", a2: "STRING", a3: "DATE", a4: "DATE", a5: "DOUBLE", a6: "INT" }, rows: [["华夏基金管理有限公司", "华夏大中华企业精选灵活配置混合(QDII)", "其他型基金", "2016-01-20", "", 21.877086009428236, 65135], ["华夏基金管理有限公司", "华夏大盘精选混合", "混合型基金", "2015-09-01", "2017-05-02", 10.307680340705128, 2944]] }],
    target_data = test_array[0].rows.map(a =>
        a.reduce((r, c, i) =>
            Object.assign(r, {
                ['A' + i]: { Description: c, type: test_array[0].columnMeta['a' + i] }
            }), {}));

console.log(target_data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
50few1ms

50few1ms2#

我的解决方案。

我喜欢使用ES6(es2015+)的方式。

const test_array = [
    {
        "name": "AnyManagedFundsRow",
        "columnMeta": {
            "a0": "STRING",
            "a1": "STRING",
            "a2": "STRING",
            "a3": "DATE",
            "a4": "DATE",
            "a5": "DOUBLE",
            "a6": "INT"
        },
        "rows": [
            [
                "华夏基金管理有限公司",
                "华夏大中华企业精选灵活配置混合(QDII)",
                "其他型基金",
                "2016-01-20",
                "",
                21.877086009428236,
                65135
            ],
            [
                "华夏基金管理有限公司",
                "华夏大盘精选混合",
                "混合型基金",
                "2015-09-01",
                "2017-05-02",
                10.307680340705128,
                2944
            ]
        ]
    }
];


/**
 * ES6 solution
 *
 */


let keys = Object.keys(test_array[0].columnMeta),
    types = Object.values(test_array[0].columnMeta),
    target_objects = test_array[0].rows.map(
    (arr) => {
        let obj = {};
        arr.forEach(
            (item, i) => {
                obj[keys[i]] = {};
                obj[keys[i]].Description = `${item}`;
                obj[keys[i]].type = types[i];
            }
        );
        return obj;
    }
);

console.log(`solution =\n`, JSON.stringify(target_objects, null, 4));

演示

zysjyyx4

zysjyyx43#

您可以使用array#reduceObject.keys()。对于每个rows,通过迭代columnMeta创建一个新对象。

const test_array = [{ name: "AnyManagedFundsRow", columnMeta: { a0: "STRING", a1: "STRING", a2: "STRING", a3: "DATE", a4: "DATE", a5: "DOUBLE", a6: "INT" }, rows: [["华夏基金管理有限公司", "华夏大中华企业精选灵活配置混合(QDII)", "其他型基金", "2016-01-20", "", 21.877086009428236, 65135], ["华夏基金管理有限公司", "华夏大盘精选混合", "混合型基金", "2015-09-01", "2017-05-02", 10.307680340705128, 2944]] }];

var result = test_array[0]['rows'].reduce((a,e) => {
  var obj = Object.keys(test_array[0]['columnMeta']).reduce((obj,key,i) => {
   return Object.assign(obj, { [key.toUpperCase()] : {'Description' : test_array[0]['columnMeta'][key], 'type' : e[i]} });
  },{});
  a.push(obj);
  return a;
},[]);
console.log(result);

相关问题