Глубокое сглаживание полей массива в объекте

У меня есть объект с некоторыми полями, которые являются массивами (либо из строк, либо из других объектов), я пытаюсь преобразовать этот объект в csv, однако в случае наличия массивов я хочу, чтобы csv шел вертикально в случае массивов (вместо горизонтального с добавлением индекса к имени поля). Перепробовав несколько npm-библиотек и онлайн-конвертеров, я не смог добиться того, чего хотел, поля с массивами просто записывались с их индексами в виде имен столбцов.

В качестве обходного пути я сейчас пытаюсь сгладить объект, чтобы конкретизировать поля массива, а затем преобразовать его в csv, но сглаживание по-прежнему сохраняет массивы как есть без изменения количества объектов на выходе. Я пробовал такие библиотеки, как lodash, underscore, Array's flat, ничего не получилось.

Есть ли способ добиться этого путем прямого преобразования в csv или, по крайней мере, сглаживания объекта.

Образец объекта, который у меня есть, приведен ниже

    [
        {
            "field1": "Hello",
            "field2": [
                "list item 1",
                "list item 2",
                "list item 3"
            ],
            "field3": [],
            "field4": [{
                "subfield1": "World",
                "subfield2": "!"
            }, {
                "subfield1": "Again",
                "subfield2": "?"
            }]
        }
    ]

На основе этого образца объекта мой вывод должен быть.

[
    {
        "field1": "Hello",
        "field2": "list item 1",
        "field3": null, // or [], in this case it wouldn't matter
        "field4": {
            "subfield1": "World",
            "subfield2": "!"
        }
    },
    {
        "field1": "Hello",
        "field2": "list item 1",
        "field3": null,
        "field4": {
            "subfield1": "Again",
            "subfield2": "?"
        }
    },
    {
        "field1": "Hello",
        "field2": "list item 2",
        "field3": null,
        "field4": {
            "subfield1": "World",
            "subfield2": "!"
        }
    },
    {
        "field1": "Hello",
        "field2": "list item 2",
        "field3": null,
        "field4": {
            "subfield1": "Again",
            "subfield2": "?"
        }
    },
    {
        "field1": "Hello",
        "field2": "list item 3",
        "field3": null,
        "field4": {
            "subfield1": "World",
            "subfield2": "!"
        }
    },
    {
        "field1": "Hello",
        "field2": "list item 3",
        "field3": null,
        "field4": {
            "subfield1": "Again",
            "subfield2": "?"
        }
    }
]

Есть ли какая-нибудь библиотека, которую я могу использовать для достижения этой цели?

Пожалуйста, посетите центр помощи, возьмите тур, чтобы увидеть, что и Как спросить. Проведите небольшое исследование – поиск SO для ответов. Если вы застряли, опубликуйте минимальный воспроизводимый пример вашей попытки, отметив ввод и ожидаемый результат, используя редактор фрагментов [<>].

mplungjan 18.03.2022 14:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете взять декартово произведение для всех значений, кроме пустых массивов.

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        const temp = [];
        if (Array.isArray(v) && !v.length) v = null;
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

const
    data = { field1: "Hello", field2: ["list item 1", "list item 2", "list item 3"], field3: [], field4: [{ subfield1: "World", subfield2: "!" }, { subfield1: "Again", subfield2: "?" }] },
    result = getCartesian(data);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Спасибо @Nina, это сработало с конечным результатом, отображающим 6 элементов с каждой комбинацией, теперь я все еще получаю для каждого объекта в моем случае ключ "0", но я могу работать с этим, понимая код и видя, где я должен изменить. Большое спасибо

hakuna matata 18.03.2022 15:08

что вы имеете в виду под "ключ "0""?

Nina Scholz 18.03.2022 16:52

Другие вопросы по теме