Преобразование объекта JSON в формат CSV в JavaScript
Я пытаюсь преобразовать объект JavaScript в формате CSV
Вы можете получить представление о моем объекте Javascript, если поместите его в онлайн-анализатор JSON http://json.parser.online.fr/
Вот как я пытался решить это... но это провалилось.. http://jsfiddle.net/fHQzC/11/
Я пытаюсь принять все значения, соответствующие значению "термин" и соответствующий заголовок в формате 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
и возможно ли загрузить файл csv в листе Excel, который я нашел в Stackoverflow, не очень мне пригодился...
Ответы
Ответ 1
вы можете попробовать как
$(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;
}
Источник
Ответ 2
Вот мое решение
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);
}
Пример:
let arr = [{name: "Essa", age: 25}];
console.log(arrayToCSV(arr));
Ответ 3
Это мое решение
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,"");
}
Ответ 4
Это быстро и грязно, но, вероятно, работает в большинстве случаев:
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())
)
Ответ 5
Ниже мое решение для преобразования массива объектов в 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')}';
}
Вы можете найти исходный код здесь