如何将具有相同构造的许多数组值映射到对象?

时间:2017-08-14 16:03:44

标签: javascript arrays json loops object

如何将嵌套数组的值映射到具有相同构造的对象模板?我曾尝试过一些方法,但仍然无法达到目标,任何人都可以帮我一个忙吗?这是我从后端获得的原始数据!

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"
        }
    }
];

只是部分正常。我怎样才能使用索引迭代一个对象?

  

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)`

3 个答案:

答案 0 :(得分:2)

您可以使用指定的类型迭代和映射值。

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; }

答案 1 :(得分:1)

您可以使用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);

答案 2 :(得分:0)

我的解决方案。

  

我喜欢使用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));

  

演示

enter image description here