我有一个像这样的对象:
{
"Group1": {
"Category1": "Value1 | Value2 | Value3",
"Category2": "Value1 | Value2 | Value3"
},
"Group2": {
"Category3": "Value1 | Value2 | Value3",
"Category4": "Value1 | Value2 | Value3"
}
}
我想要得到的应该是这样的:
是CSV还是XLSX都没关系,我尝试使用npm中的某些程序包转换json-> csv / xlsx,但得到了一些结果,但不是我要的结果。
直到现在,我唯一的想法是得到一个数组,就像在第二个sreenshot上一样,然后使用npm中的一些特殊软件包将其转换为CSV:
但是也许有一些更简单的解决方案? 任何帮助将不胜感激!和平!
答案 0 :(得分:1)
您可以采取以下方法:将对象更改为带有空键的对象,然后在结果集中将所有嵌套属性映射为空格
基本上,它获取对象的条目并寻找其他对象,如果是,则再次调用该函数或获取结果集中新行的键和值。
每个递归结果集在行中填充一个空白,对于所有嵌套属性,您将获得一个相应的缩进。
function getCSV(object) {
return Object.entries(object).reduce((r, [k, v]) => {
if (v && typeof v === 'object') {
if (k) r.push([k]);
r.push(...getCSV(v).map(a => ['', ...a]));
} else {
r.push([k, v]);
}
return r;
}, []);
}
var data = { Group1: { Category1: "Value1 | Value2 | Value3", Category2: "Value1 | Value2 | Value3" }, Group2: { Category3: "Value1 | Value2 | Value3", Category4: "Value1 | Value2 | Value3" } },
result = getCSV({ '': data });
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
或者为所需的空字符串获取一个间隔符数组。
function getCSV(object, length = 0) {
var spacer = Array.from({ length }, _ => '');
return Object.entries(object).reduce((r, [k, v]) => {
if (v && typeof v === 'object') {
r.push(spacer.concat(k));
r.push(...getCSV(v, length + 1));
} else {
r.push(spacer.concat([k, v]));
}
return r;
}, []);
}
var data = { Group1: { Category1: "Value1 | Value2 | Value3", Category2: "Value1 | Value2 | Value3" }, Group2: { Category3: "Value1 | Value2 | Value3", Category4: "Value1 | Value2 | Value3" } },
result = getCSV(data, 1);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }