Подтвердить что ты не робот

Преобразование объекта 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, не очень мне пригодился...

4b9b3361

Ответ 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')}';
}

Вы можете найти исходный код здесь