递归添加对象属性

Him*_*mel 3 javascript arrays recursion

如果我有一个数组数组,每个数组都包含对象属性名称(字符串),我如何递归修改对象以检查该属性是否存在并相应地添加它。数组中的最后一个值将作为给定属性的字符串值应用。

const propsToAdd = [
    ['propA', 'value'], 
    ['propB', 'propC', 'propD', 'value'],
    ['propB', 'propF', 'value']
];
Run Code Online (Sandbox Code Playgroud)

生成的对象将包含相关属性(相应地嵌套),并且最终属性的值将等于数组中的最后一项。

const resultingObj = { 
    propA: 'value', 
    propB: { 
        propC: {
            propD: 'value'
        }
        propF: 'value'
    } 
};
Run Code Online (Sandbox Code Playgroud)

我想递归地创建这样一个对象,因为数组的长度未知,子数组也是如此。

需要注意的是,以下情况不会发生,也不需要适应。

const propsToAdd = [
    ['propA', 'value'],
    ['propA', 'value', 'value1']
];
Run Code Online (Sandbox Code Playgroud)

换句话说,value(作为 的子级propA)不能同时是属性值名称。

如何编写一个递归函数,将键/值对添加(和嵌套)到对象中?

198*_*983 6

由于您使用的是constES2015,因此您可以使用箭头函数解构赋值默认参数

const nest = ([x, ...xs], o={}) =>
    xs.length === 0 ? x : (o[x] = nest(xs,o[x]), o);

const nestmany = ([xs, ...yss], o={}) =>
    xs === undefined ? o : nestmany(yss, nest(xs,o));

const propsToAdd = [
    ['propA', 'value1'],
    ['propB', 'propC', 'propD', 'value2'],
    ['propB', 'propF', 'value3']
];

console.log(nestmany(propsToAdd));
Run Code Online (Sandbox Code Playgroud)