【问题标题】:Json to csv dynamic columns javascriptJson 到 csv 动态列 javascript
【发布时间】:2020-03-30 15:17:43
【问题描述】:

我有一个对象数组,我需要转换为 csv,但这些对象具有动态键,我已经使用具有更多键的对象创建了我的 csv 列,现在我需要如果一行没有该列的属性必须为空。

我目前的做法:

let output =  [{

    "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "7",
    "De 0 a 10, que nota atribui à QUALIDADE do Compass": "8",
    "Alguns destes itens já apresentou defeito?": "Painel do Motorista.",
    "Pergunta teste insertção dinâmica": "Painel do Motorista"
},

{
    "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "7",
    "De 0 a 10, que nota atribui à QUALIDADE do Compass": "8",
    "Test Question":"foo",
    "Alguns destes itens já apresentou defeito?": "Painel do Motorista.",
    "Test 2 Question":"bar",
    "Pergunta teste insertção dinâmica": "Painel do Motorista",


}]

  let key = 0;
      let max = 0;
      output.forEach(function(v, k) {
        if (max < +Object.keys(v).length) {
          max = +Object.keys(v).length;
          key = k;
        }
      });

      let csvContent = "data:text/csv;charset=utf-8,";
      csvContent += [
        Object.keys(output[key]).join(";"),
        ...output.map(item => {
          console.log(item)
          console.log( Object.values(item).join(";"))
          ;
        })
      ]
        .join("\n")
        .replace(/(^\[)|(\]$)/gm, "");

      const csv = encodeURI(csvContent);
      const link = document.createElement("a");
      link.setAttribute("href", csv);
      link.setAttribute("download", "export.csv");
      link.click();
    },

当前 CSV 输出:

De 0 a 10 qual a chance de você RECOMENDAR o Compass?,De 0 a 10 que nota atribui à QUALIDADE do Compass,Test Question,Alguns destes itens já apresentou defeito?,Test 2 Question,Pergunta teste insertção dinâmica

7,8,Painel do Motorista,Painel do Motorista,Painel do Motorista,Painel do Motorista
5,5,foo,Painel do Motorista,bar,Painel do Motorista

所需的 CSV 输出(如果对象没有属性,则该列必须为空):

De 0 a 10 qual a chance de você RECOMENDAR o Compass?,De 0 a 10 que nota atribui à QUALIDADE do Compass,Test Question,Alguns destes itens já apresentou defeito?,Test 2 Question,Pergunta teste inserção dinâmica.

7,8,,Painel do Motorista,,Painel do Motorista
5,5,foo,Painel do Motorista,bar,Painel do Motorista

感谢任何帮助,在此先感谢。

【问题讨论】:

    标签: javascript ecmascript-6 javascript-objects


    【解决方案1】:

    我在你的函数中看到了:

    console.log( Object.values(item).join(";"))
    

    您只需加入项目的所有现有值。尝试用键映射它:

    console.log(Object.keys(output[key]).map(it => item[it] || '').join(";"))
    

    这将遍历 csv 的现有组合标题,如果存在则检索值,否则添加空字符串 也不要忘记来自...output.map(): 的返回值,目前它只包含 console.log 操作

    let csvContent = "data:text/csv;charset=utf-8,";
          csvContent += [
            Object.keys(output[key]).join(";"),
            ...output.map(item => {
              return Object.keys(output[key]).map(it => item[it] || '').join(";");
            })
          ]
            .join("\n")
            .replace(/(^\[)|(\]$)/gm, "");
    

    【讨论】:

    • 感谢您的宝贵时间,我的 csv 只是空的标题列没有解决
    • 因为在...output.map 中,您只将元素记录到控制台。在两个 console.log 之后添加类似return Object.keys(output[key]).map(it =&gt; item[it] || '').join(";")
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2017-07-29
    • 2021-02-11
    • 2015-12-25
    • 1970-01-01
    • 2021-07-26
    • 2018-08-20
    • 2015-09-08
    相关资源
    最近更新 更多