Как заполнить CSV-файл элементами объекта в JS - PullRequest
0 голосов
/ 25 марта 2020

У меня есть объект, и я хотел бы поместить элементы этого объекта в файл CSV, однако, когда я пытаюсь получить ключ объекта, он возвращает ошибку типа: Uncaught TypeError: Cannot преобразовать undefined или null в объект.

Когда я консоль регистрирую объект, он фактически показывает все элементы, но по какой-то причине я не могу получить ключ и значения обратно.

Вот как я консольно зарегистрировал объект: console.log(JSON.stringify(records));

И вот что я получаю обратно: {"id":"5e7b389911c2125dfaf2b5f2","title":"Example Application Number 1","status":"Ready For Submission","principalInvestigator":"Mr. Harry Styles","coInvestigators":["Niall Horan, Liam Payne, Zayn Malik, Louis Tomilson"],"partners":null,"funder":"Innovate UK","researchGroup":"AHIVES","scheme":"GCRF","requestedAmount":null,"estimatedAmount":1234,"submissionDate":"2020-03-23T00:00:00.000+01:00","startDate":"2020-03-29T00:00:00.000+01:00","estimatedDuration":null,"endDate":null,"facility":null,"comments":null,"dateCreated":"2020-03-25T11:55:21.902+01:00","lastUpdated":"2020-03-25T11:55:21.902+01:00","dateDeleted":null}

Вот полная js функция:

window.downloadCsv = function(records) {

    console.log(JSON.stringify(records));

    // Use first element to choose the keys and the order
    let keys = Object.keys(records[0]);

    // Build header
    let result = keys.join("\t") + "\n";

    // Add the rows
    records.forEach(function(obj){
        result += keys.map(k => obj[k]).join("\t") + "\n";
    });

    return result;

Вот как я анализирую объект на js из тимьяна:

 <button title="Downloads the data from the query into a CSV"
                        class="inline-flex items-center bg-red-600 text-white font-bold px-4 py-1
                        rounded shadow hover:bg-red-500"
                        type="submit"
                        th:onclick="downloadCsv(/*[[${record}]]*/)">

                    <span>Download</span>
                    <svg class="fill-current w-4 h-4 ml-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
                        <path d="M13 8V2H7v6H2l8 8 8-8h-5zM0 18h20v2H0v-2z" /></svg>
                </button>

1 Ответ

0 голосов
/ 25 марта 2020

В вашем случае вы ожидаете, что записи будут массивом, но это объект (возможно, одно значение в массиве). Кроме того, такие поля, как coInvestistigators являются массивом, а не строкой, что является отдельным случаем, который вам нужно обработать.

Вы получаете доступ к records[0], что означает, что вы пытаетесь получить доступ { 0: <some_value> } в вашем JSON объекте. В вашем случае records не является массивом и не содержит ключа 0, поэтому records[0] равно undefined.

Object.keys принимает объект Javascript и возвращает все ключи в массиве.

Это означает, что Object.keys(records[0]) вызовет ошибку, поскольку значение records[0] не определено.

Object.keys(records) вернет ["id", "title", "status", ...]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...