javascript - 用js将json转成csv
问题描述
我需要将我的 JSON 转换为 CSV 文件,但我不知道如何正确执行。
我已经有这个代码
let rows = typeof objArray !== "object" ? JSON.parse(objArray) : objArray;
let header = "";
Object.keys(rows[0]).map(pr => (header += pr + ";"));
let str = "";
rows.forEach(row => {
let line = "";
let columns =
typeof row !== "object" ? JSON.parse(row) : Object.values(row);
columns.forEach(column => {
if (line !== "") {
line += ";";
}
if (typeof column === "object") {
line += JSON.stringify(column);
} else {
line += column;
}
});
str += line + "\r\n";
});
return header + "\r\n" + str;
但我期待与现在不同的结果
我需要这个预期的结果
function ConvertToCSV(objArray) {
let rows = typeof objArray !== "object" ? JSON.parse(objArray) : objArray;
let header = "";
Object.keys(rows[0]).map(pr => (header += pr + ";"));
let str = "";
rows.forEach(row => {
let line = "";
let columns =
typeof row !== "object" ? JSON.parse(row) : Object.values(row);
columns.forEach(column => {
if (line !== "") {
line += ";";
}
if (typeof column === "object") {
line += JSON.stringify(column);
} else {
line += column;
}
});
str += line + "\r\n";
});
return header + "\r\n" + str;
}
function downloadCSV () {
let data = [{"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab": {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}}]
let result = ConvertToCSV(data);
let fileToSave = new Blob([result], {
type: "csv",
name: 'data.csv
});
saveAs(fileToSave, 'data.csv);
}
<script src="https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js"></script>
<button onclick="downloadCSV">download csv</button>
解决方案
你可以试试这个
function downloadCSV () {
let arr = [{"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab": {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}},
{"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab": {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}}
];
var keys = [];
var values = [];
function getKeys(data, k = '') {
for (var i in data) {
var rest = k.length ? '_' + i : i
if (typeof data[i] == 'object') {
if (!Array.isArray(data[i])) {
getKeys(data[i], k + rest)
}
} else keys.push( k+ rest)
}
}
function getValues(data, k = '') {
for (var i in data) {
var rest = k.length ? '' + i : i
if (typeof data[i] == 'object') {
if (!Array.isArray(data[i])) {
getValues(data[i], k + rest)
}
}
else values.push(data[rest])
}
}
getKeys(arr[0])
var value="";
arr.forEach(x=>{
values=[];
getValues(x);
value+=values.join(";")+"\r\n";
})
let result = keys.join(";")+"\r\n"+value;
let fileToSave = new Blob([result], {
type: "csv",
name: 'data.csv'
});
saveAs(fileToSave, 'data.csv');
}
<script src="https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js"></script>
<button onclick="downloadCSV()">download csv</button>
推荐阅读
- c# - WinForms 本地化。如何更改菜单的语言
- django-cms - django-cms 不加载自定义菜单
- docker - 如何使用自签名证书运行 docker 容器
- wordpress - 如果找不到文件,则 Htaccess 重写
- c - For Loop 在 MPLAB IDE for PIC 微控制器程序中无法正常工作
- android - fcm 推送通知不适用于一加 6 手机
- mongodb - 如果安全,则无法连接到 mongodb
- c++ - C++中如何用getter方法实现封装
- node.js - Node.js - 如何同时导出对象和函数
- ms-access - 重复记录明细并记录在报告的同一页面中