52

我正在尝试将 JavaScript 对象集转换为 CSV 格式

如果您将其放入在线 JSON 解析器https://jsonformatter.org/json-parser,您可以了解我的 Javascript 对象

这就是我试图解决它的方式......但它失败了...... 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
                              

是否可以在 Excel 表格中下载 csv 文件,我在 Stackoverflow 中找到的那个文件对我并没有真正的用处...

4

10 回答 10

29

你可以试试

$(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;
        }

资源

于 2012-06-29T06:34:01.810 回答
28

可能更优雅和最简单的解决方案

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()
      }
    ]
  )
)

于 2019-11-08T15:34:44.173 回答
25

这是我的解决方案

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));
于 2017-10-26T07:32:26.370 回答
11

这是一个类似于mightybruno's answer的解决方案,它处理包含逗号的字符串。其他答案似乎都没有考虑到这一点。

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')
}
于 2020-11-20T11:52:32.567 回答
7

下面的代码会将 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();
  }
于 2020-11-03T13:14:21.547 回答
2

这是一个快速而肮脏的方法,但可能适用于大多数情况:

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())
)
于 2019-05-04T14:12:25.743 回答
1

类似于mightybruno的回答,但如果需要,这将允许单独访问标题和内容(通过将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");
}
于 2020-09-18T00:31:44.863 回答
1

使用 papaparse 库将 JSON 转换为 CSV,反之亦然。请参阅此链接 - https://www.papaparse.com/

于 2020-09-01T19:13:50.263 回答
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,"");
}
于 2016-01-20T08:55:03.840 回答
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;
    }
于 2021-07-06T18:28:31.987 回答