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

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

问题描述:

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

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

+0

https://github.com/gildata/RAIO/issues/77 – xgqfrms

+1

“_I试过一些方法,_” 那么告诉我们你尝试过什么,解释什么都没有工作,然后问一个具体的问题。你应该阅读[为什么是“有人可以帮我吗?”不是一个实际的问题?](http://meta.*.com/q/284236) – csmckelvey

+0

https://*.com/questions/43137010/convert-阵列值到对象的按键/ 45687156#45687156 – 2017-08-15 05:54:14

你可以迭代和值有指定的类型映射。

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

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