如何将嵌套对象数组转换为CSV?

use*_*573 2 javascript recursion nested traversal

我有一个嵌套对象的数组,例如:

[
    {"name": "1", "children": [{"name": "1.1", "children":"1.2"}]},
    {"id": "2", "thing": [{"name": "2.1", "children":"2.2"}]},
    {"name": "3", "stuff": [{"name": "3.1", "children":"3.2"}]},
]
Run Code Online (Sandbox Code Playgroud)

对象可以包含不同类型的值,包括其他嵌套对象.

我想将此数组转换为CSV格式.

我试图用for .. in循环,常规嵌套for循环.map()和递归进行迭代.我认为递归可能是解决这个特定问题的唯一方法.对于CSV字段名称,我想使用导致该值的键序列.

对于给定的示例,我正在寻找的CSV结果是:

name, children.name, children.children,id, thing.name, thing.children,  stuff.name, stuff.children
1, 1.1, 1.2,
,,,2,2.1,2.2
3,,,,3,3.1,3.2
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 6

您可以使用此ES6函数创建您要查找的2D阵列,然后您可以轻松地将其转换为CSV:

function pivot(arr) {
    var mp = new Map();
    
    function setValue(a, path, val) {
        if (Object(val) !== val) { // primitive value
            var pathStr = path.join('.');
            var i = (mp.has(pathStr) ? mp : mp.set(pathStr, mp.size)).get(pathStr);
            a[i] = val;
        } else {
            for (var key in val) {
                setValue(a, key == '0' ? path : path.concat(key), val[key]);
            }
        }
        return a;
    }
    
    var result = arr.map( obj => setValue([], [], obj) );
    return [[...mp.keys()], ...result];
}

function toCsv(arr) {
    return arr.map( row => 
        row.map ( val => isNaN(val) ? JSON.stringify(val) : +val ).join(',')
    ).join('\n');
}

// Sample data
var arr = [
    {"name": "1", "children": [{"name": "1.1", "children":"1.2"}]},
    {"id": "2", "thing": [{"name": "2.1", "children":"2.2"}]},
    {"name": "3", "stuff": [{"name": "3.1", "children":"3.2"}]},
];

// Conversion to 2D array and then to CSV:
console.log(toCsv(pivot(arr)));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

有关将2D阵列转换为CSV的其他方法,请参阅此问答.