我正在尝试将设置的JavaScript对象转换为CSV格式
如果你将它放在在线JSON解析器http://json.parser.online.fr/
中,你可以了解我的Javascript对象这就是我试图解决的问题......但它失败了.. http://jsfiddle.net/fHQzC/11/
我正在尝试将对应于值“term”和相应标题的整个值转换为CSV格式
预期输出类似
Time,Dec 9, 2012
News,Germany,election, Egypt,Revolution, Japan, Earthquake
Person,Obama, Beckham
Title,Pearce Snubs Beckham
Time,Dec 5, Birthday
Person, Lebron James
News,Italy,Euro 2012 Final
Title-Heats National Champions
是否可以在excel表中下载csv文件,我在Stackoverflow中找到的那个文件对我来说真的没用...
答案 0 :(得分:23)
你可以尝试
$(document).ready(function () {
// Create Object
var items = [
{ name: "Item 1", color: "Green", size: "X-Large" },
{ name: "Item 2", color: "Green", size: "X-Large" },
{ name: "Item 3", color: "Green", size: "X-Large" }];
// Convert Object to JSON
var jsonObject = JSON.stringify(items);
// Display JSON
$('#json').text(jsonObject);
// Convert JSON to CSV & Display CSV
$('#csv').text(ConvertToCSV(jsonObject));
});
和一个函数ConvertToCSV
// JSON to CSV Converter
function ConvertToCSV(objArray) {
var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
var str = '';
for (var i = 0; i < array.length; i++) {
var line = '';
for (var index in array[i]) {
if (line != '') line += ','
line += array[i][index];
}
str += line + '\r\n';
}
return str;
}
答案 1 :(得分:8)
这是我的解决方案
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Telephone { get; set; }
}
示例:
function arrayToCSV(objArray) {
const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
let str = `${Object.keys(array[0]).map(value => `"${value}"`).join(",")}` + '\r\n';
return array.reduce((str, next) => {
str += `${Object.values(next).map(value => `"${value}"`).join(",")}` + '\r\n';
return str;
}, str);
}
答案 2 :(得分:1)
这是我的解决方案
https://jsfiddle.net/dhou6y3o/
function iterateObject(obj) {
var value = '', header = '';
for (name in obj) {
if (obj.hasOwnProperty(name)) {
if (isObject(obj[name])) {
var out = iterateObject(obj[name]);
value += out.value;
header += out.header;
} else {
value += removeNewLine(obj[name]) + '; ';
header += name + '; ';
}
}
}
return {
"value":value,
"header":header
};
}
function isObject(obj) {
return (typeof obj === 'object');
}
function removeNewLine(item) {
return item.toString().replace(/(\r\n|\n|\r)/gm,"");
}
答案 3 :(得分:1)
下面的代码将JSON数组转换并下载为文件到csv。
function exportJSONToCSV(objArray) {
var arr = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
var str =
`${Object.keys(arr[0])
.map((value) => `"${value}"`)
.join(',')}` + '\r\n';
var csvContent = arr.reduce((st, next) => {
st +=
`${Object.values(next)
.map((value) => `"${value}"`)
.join(',')}` + '\r\n';
return st;
}, str);
var element = document.createElement('a');
element.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvContent);
element.target = '_blank';
element.download = 'export.csv';
element.click();
}
答案 4 :(得分:1)
这是一种解决方法,类似于maybybruno的答案,该答案处理包含逗号的字符串。其他答案似乎都没有考虑到这一点。
function objectsToCSV(arr) {
const array = [Object.keys(arr[0])].concat(arr)
return array.map(row => {
return Object.values(row).map(value => {
return typeof value === 'string' ? JSON.stringify(value) : value
}).toString()
}).join('\n')
}
答案 5 :(得分:0)
这是一种快速而又肮脏的方法,但可能在大多数情况下都有效:
const headers = Object.keys(objAry[0])
console.log(headers.join())
objAry.forEach(r => console.log(
Object.values(r)
.map(c => Array.isArray(c)? `"${c.join()}"` : c)
.join())
)
答案 6 :(得分:0)
可能更优雅,最简单的解决方案
function convertToCSV(arr) {
const array = [Object.keys(arr[0])].concat(arr)
return array.map(it => {
return Object.values(it).toString()
}).join('\n')
}
console.log(
convertToCSV(
[
{
id: 1,
name: 'Foo',
timestamp: new Date()
},
{
id: 2,
name: 'Bar',
timestamp: new Date()
},
{
id: 3,
name: 'Baz',
timestamp: new Date()
}
]
)
)
答案 7 :(得分:0)
使用papaparse库将JSON转换为CSV和Vice Versa。 请参阅此链接-https://www.papaparse.com/
答案 8 :(得分:0)
与maybybruno的答案类似,但是如果需要的话,这将允许对标头和内容的单独访问(通过将join
语句移到函数的后面)。
function objToCsv(data) {
const headers = Object.keys(data[0]).join();
const content = data.map(r => Object.values(r).join());
return [headers].concat(content).join("\n");
}
答案 9 :(得分:0)
function objToCsv(arr) {
let claves = Object.keys(arr[0]).sort();
let rows = claves.join(";") + "\r\n";
arr.forEach((row) => {
let nrow = [];
claves.forEach((clave) => {
let valor = JSON.stringify(row[clave]);
nrow.push(valor.split(";").join(" ").split(",").join(" "));
});
rows = rows + nrow.join(";") + "\r\n";
});
return rows;
}
答案 10 :(得分:-2)
以下是我的解决方案,用于将对象数组转换为CSV,以转义特殊字符和非统一对象数组。
function getKeys(obj, prefix = '') {
if (typeof obj === 'undefined' || obj === null) return [];
return [
...Object.keys(obj).map(key => `${prefix}${key}`),
...Object.entries(obj).reduce((acc, [key, value]) => {
if (typeof value === 'object') return [...acc, ...getKeys(value, `${prefix}${key}.`)];
return acc;
}, []),
];
}
function flatObject(obj, prefix = '') {
if (typeof obj === 'undefined' || obj === null) return {};
return Object.entries(obj).reduce((acc, [key, value]) => {
if (typeof value === 'object') return { ...acc, ...flatObject(value, `${prefix}${key}.`) };
return { ...acc, [`${prefix}${key}`]: value };
}, {});
}
function escapeCsvValue(cell) {
if (cell.replace(/ /g, '').match(/[\s,"]/)) {
return '"' + cell.replace(/"/g, '""') + '"';
}
return cell;
}
function objectsToCsv(arrayOfObjects) {
// collect all available keys
const keys = new Set(arrayOfObjects.reduce((acc, item) => [...acc, ...getKeys(item)], []));
// for each object create all keys
const values = arrayOfObjects.map(item => {
const fo = flatObject(item);
const val = Array.from(keys).map((key: string) => (key in fo ? escapeCsvValue(`${fo[key]}`) : ''));
return val.join(',');
});
return `${Array.from(keys).join(',')}\n${values.join('\n')}`;
}
您可以从here
中找到源代码