将对象树存储到csv / xlsx

时间:2019-07-10 18:25:41

标签: javascript arrays node.js

我有一个像这样的对象:

{
    "Group1": {
        "Category1": "Value1 | Value2 | Value3",
        "Category2": "Value1 | Value2 | Value3"
    },
    "Group2": {
        "Category3": "Value1 | Value2 | Value3",
        "Category4": "Value1 | Value2 | Value3"
    }
} 

我想要得到的应该是这样的:

Screenshot

是CSV还是XLSX都没关系,我尝试使用npm中的某些程序包转换json-> csv / xlsx,但得到了一些结果,但不是我要的结果。

直到现在,我唯一的想法是得到一个数组,就像在第二个sreenshot上一样,然后使用npm中的一些特殊软件包将其转换为CSV:

Screenshot

但是也许有一些更简单的解决方案? 任何帮助将不胜感激!和平!

1 个答案:

答案 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; }