У меня есть объект с некоторыми полями, которые являются массивами (либо из строк, либо из других объектов), я пытаюсь преобразовать этот объект в 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": "?"
}
}
]
Есть ли какая-нибудь библиотека, которую я могу использовать для достижения этой цели?
Вы можете взять декартово произведение для всех значений, кроме пустых массивов.
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"
, но я могу работать с этим, понимая код и видя, где я должен изменить. Большое спасибо
что вы имеете в виду под "ключ "0"
"?
Пожалуйста, посетите центр помощи, возьмите тур, чтобы увидеть, что и Как спросить. Проведите небольшое исследование – поиск SO для ответов. Если вы застряли, опубликуйте минимальный воспроизводимый пример вашей попытки, отметив ввод и ожидаемый результат, используя редактор фрагментов [<>].