将对象数组格式化为二维数组
Format Array of Objects into a 2D array
我有一个对象数组,我想将其转换为 react-csv(二维数组)使用的格式。 2D 应该看起来像一个嵌套循环,类似于
最终结果应该是这样的
[
["Name", "Message", "Column", "configDataType","dbDataType"],
["STAGE", "Columns present in source config but not in the database.", "TEST"],
["", "", "TEST1"],
["", "", "TEST2"],
["", "Columns present in database but not in the source config.", ""],
["", "Columns with datatype mismatch.", "LAST_NAME", "varchar(50)", "varchar(40)"],
["", "", "FIRST_NAME", "varchar(50)", "varchar(40)"],
["RAW", "Column sets are identical."],
["LAST", "Column sets are identical."],
["HIST", "Column sets are identical."],
["CORE", "Column sets are identical."],
["ADDR", "Column sets are identical."],
["CONFIG", "Column sets are identical."],
["ACTION", "Column sets are identical."],
]
这是我到目前为止所做的,但我无法获得预期的结果。请告诉我我缺少什么。
const data = {
"STAGE": [{
"infoLevel": "error",
"message": "Columns present in source config but not in the database.",
"columns": [],
"columnsName": [
"TEST",
"TEST1",
"TEST2"
],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns present in database but not in the source config.",
"columns": [],
"columnsName": [],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns with datatype mismatch.",
"columns": [{
"name": "LAST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}, {
"name": "FIRST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}],
"columnsName": [],
"type": "Table"
}
],
"RAW": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"LAST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"HIST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CORE": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ADDR": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"TRAN": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CONFIG": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ACTION": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}]
}
const res = _.flattenDeep(Object.keys(data).map(i => {
return data[i].map(j => {
return {
...j,
tableName: i
}
})
}))
console.log(res.map(i => {
return [
i.tableName,
i.message,
...((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? j : j.name)),
..._.compact(((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? '' : j.configDatatype))),
...(((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? '' : j.dbDatatype)))
]
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
为什么不使用旧式命令式代码?试试这个:
const data = {
"STAGE": [{
"infoLevel": "error",
"message": "Columns present in source config but not in the database.",
"columns": [],
"columnsName": [
"TEST",
"Arun",
"Abnc"
],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns present in database but not in the source config.",
"columns": [],
"columnsName": [],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns with datatype mismatch.",
"columns": [{
"name": "LAST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}, {
"name": "FIRST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}],
"columnsName": [],
"type": "Table"
}
],
"RAW": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"LAST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"HIST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CORE": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ADDR": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"TRAN": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CONFIG": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ACTION": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}]
};
var rows = [];
for (var c1 in data) {
const list = data[c1];
for (var i in list) {
const obj = list[i];
var c2 = obj.message;
for (var j in obj.columnsName) {
rows.push([c1, c2, obj.columnsName[j]]);
c1 = ""; c2 = "";
}
for (var j in obj.columns) {
const col = obj.columns[j];
rows.push([c1, c2, col.name, col.configDatatype, col.dbDatatype]);
c1 = ""; c2 = "";
}
if (c2 != "") rows.push([c1, c2]);
c1 = "";
}
}
console.log(rows);
我有一个对象数组,我想将其转换为 react-csv(二维数组)使用的格式。 2D 应该看起来像一个嵌套循环,类似于
最终结果应该是这样的
[
["Name", "Message", "Column", "configDataType","dbDataType"],
["STAGE", "Columns present in source config but not in the database.", "TEST"],
["", "", "TEST1"],
["", "", "TEST2"],
["", "Columns present in database but not in the source config.", ""],
["", "Columns with datatype mismatch.", "LAST_NAME", "varchar(50)", "varchar(40)"],
["", "", "FIRST_NAME", "varchar(50)", "varchar(40)"],
["RAW", "Column sets are identical."],
["LAST", "Column sets are identical."],
["HIST", "Column sets are identical."],
["CORE", "Column sets are identical."],
["ADDR", "Column sets are identical."],
["CONFIG", "Column sets are identical."],
["ACTION", "Column sets are identical."],
]
这是我到目前为止所做的,但我无法获得预期的结果。请告诉我我缺少什么。
const data = {
"STAGE": [{
"infoLevel": "error",
"message": "Columns present in source config but not in the database.",
"columns": [],
"columnsName": [
"TEST",
"TEST1",
"TEST2"
],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns present in database but not in the source config.",
"columns": [],
"columnsName": [],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns with datatype mismatch.",
"columns": [{
"name": "LAST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}, {
"name": "FIRST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}],
"columnsName": [],
"type": "Table"
}
],
"RAW": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"LAST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"HIST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CORE": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ADDR": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"TRAN": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CONFIG": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ACTION": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}]
}
const res = _.flattenDeep(Object.keys(data).map(i => {
return data[i].map(j => {
return {
...j,
tableName: i
}
})
}))
console.log(res.map(i => {
return [
i.tableName,
i.message,
...((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? j : j.name)),
..._.compact(((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? '' : j.configDatatype))),
...(((i.columns.length > 0 ? i.columns : i.columnsName).map(j => typeof j === 'string' ? '' : j.dbDatatype)))
]
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
为什么不使用旧式命令式代码?试试这个:
const data = {
"STAGE": [{
"infoLevel": "error",
"message": "Columns present in source config but not in the database.",
"columns": [],
"columnsName": [
"TEST",
"Arun",
"Abnc"
],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns present in database but not in the source config.",
"columns": [],
"columnsName": [],
"type": "String"
},
{
"infoLevel": "error",
"message": "Columns with datatype mismatch.",
"columns": [{
"name": "LAST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}, {
"name": "FIRST_NAME",
"configDatatype": "varchar(50)",
"dbDatatype": "varchar(40)"
}],
"columnsName": [],
"type": "Table"
}
],
"RAW": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"LAST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"HIST": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CORE": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ADDR": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"TRAN": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"CONFIG": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}],
"ACTION": [{
"infoLevel": "success",
"message": "Column sets are identical.",
"columns": [],
"columnsName": [],
"type": "String"
}]
};
var rows = [];
for (var c1 in data) {
const list = data[c1];
for (var i in list) {
const obj = list[i];
var c2 = obj.message;
for (var j in obj.columnsName) {
rows.push([c1, c2, obj.columnsName[j]]);
c1 = ""; c2 = "";
}
for (var j in obj.columns) {
const col = obj.columns[j];
rows.push([c1, c2, col.name, col.configDatatype, col.dbDatatype]);
c1 = ""; c2 = "";
}
if (c2 != "") rows.push([c1, c2]);
c1 = "";
}
}
console.log(rows);