我有一个返回 2D 对象的 ajax 调用,我希望能够将其转换为 .csv
文件以供用户下载。
PHP代码:echo json_encode($results);
js 函数现在有 console.log (JSON.parse(res));
所以我可以验证内容。
控制台日志显示:
Object {color: Object, animal: Object}
color: Object
1: "red"
2: "white"
3: "blue"
animal: Object
1: "cat"
2: "dog"
3: "mouse
每个内部对象始终具有相同数量的元素(在本例中为 3)
我想将其转换为 csv,然后下载。 csv 的第一行将包含外部对象键(颜色、动物),csv 最终将如下所示:
"color, animal"
"red, cat"
"white, dog"
"blue, mouse"
通过我看过的解决方案,他们将对象的连接版本附加到每一行。我需要垂直转置数据。
我认为我需要遍历每个内部对象(获取每个对象的第 n 个元素,获取每个对象的第 n+1 个元素等)并构建我自己的 csv 字符串,但这看起来非常笨重。
有什么漂亮的数组/对象函数可以帮助我吗?
我能够创建并下载 .csv 文件,只是这个数据转置逻辑让我陷入困境。
编辑:我没有尝试将 csv 字符串转换为数组,也没有尝试转置 2D 数组(它是一个 2D 对象)。
澄清 在对 php 文件的 ajax 调用中,我发送了一个从用户输入派生的 ["color", "animal"]
数组。 php 文件读取该数组并根据该数组收集数据。收集数据后,它会返回一个二维数组,内部数组是新数据。因此:
[color[red, white, blue], animal[cat,dog,mouse]]
最佳答案
你可以尝试这样的事情:
var rep = JSON.parse('{"color":{"1":"red","2":"white","3":"blue"},"animal":{"1":"cat","2":"dog","3":"mouse"}}')
function toCSV(jsonObject) {
var csv = [];
for (var i in jsonObject) {
if (jsonObject.hasOwnProperty(i)) {
var title = i.indexOf(' ')>-1? '"'+i+'"': i;
csv[0] ? csv[0].push(title) : csv[0] = [title];
var k = Object.keys(jsonObject[i]);
for (var j = 0; j < k.length; j++) {
var val = jsonObject[i][k[j]].indexOf(' ')>-1? '"'+jsonObject[i][k[j]]+'"': jsonObject[i][k[j]];;
csv[j+1] ? csv[j + 1].push(val) : csv[j+1] = [val];
}
}
}
return csv.join('\n');
}
document.body.innerHTML = toCSV(rep).replace(/\n/g, '<br>');
关于javascript - JS : convert 2D object with keys to transposed csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151525/