Json в CSV Dynami c столбцы javascript - PullRequest
0 голосов
/ 30 марта 2020

У меня есть массив объектов, и мне нужно преобразовать в 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

Благодарим за любую помощь, заранее спасибо.

1 Ответ

1 голос
/ 30 марта 2020

Я вижу в вашей функции:

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, "");
...