如何将嵌套数组的值映射到具有相同构造的对象模板?我曾尝试过一些方法,但仍然无法达到目标,任何人都可以帮我一个忙吗?这是我从后端获得的原始数据!
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 :(得分: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#reduce
和Object.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));
演示