Javascript 递归地添加对象属性

Javascript 递归地添加对象属性,javascript,arrays,recursion,Javascript,Arrays,Recursion,如果我有一个数组数组,每个数组都由对象属性名(字符串)组成,那么如何递归地修改对象以检查属性是否存在并相应地添加它。数组中的最后一个值将作为给定属性的字符串值应用 const propsToAdd = [ ['propA', 'value'], ['propB', 'propC', 'propD', 'value'], ['propB', 'propF', 'value'] ]; 结果对象将包含相关属性(相应嵌套),最终属性的值将等于数组中的最后一项 const re

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

const propsToAdd = [
    ['propA', 'value'], 
    ['propB', 'propC', 'propD', 'value'],
    ['propB', 'propF', 'value']
];
结果对象将包含相关属性(相应嵌套),最终属性的值将等于数组中的最后一项

const resultingObj = { 
    propA: 'value', 
    propB: { 
        propC: {
            propD: 'value'
        }
        propF: 'value'
    } 
};
我想递归地创建这样一个对象,因为数组和子数组的长度都是未知的

需要注意的是,以下情况不会发生,也不需要考虑

const propsToAdd = [
    ['propA', 'value'],
    ['propA', 'value', 'value1']
];
否则,
value
(作为
propA
的子级)不能既是属性又是值名


如何编写向对象添加(并嵌套)键/值对的递归函数?

createRec以嵌套形式递归创建对象

函数processInput(propsToAdd){
var resultingObj={},
普罗帕;
对于(变量i=0,len=propsToAdd.length;i]));它不是递归版本,但为什么不是呢

function createObj( propsToAdd ){
    obj = {}
    for( var i = 0; i < propsToAdd.length; i++ ){
       var tmp = obj;
       var props = propsToAdd[i];
       for( var j = 0; j < props.length-2; j++ ){
           var prop_name = props[ j ];
           if( !( prop_name in tmp ) ) 
               tmp[ prop_name ] = {}
           tmp = tmp[ prop_name ];
       }
       if( props.length > 1 )
          tmp[ props[ j ] ] = props[ j + 1 ]
       else 
          obj = props[0];
    }
    return obj;
}
函数createObj(propsToAdd){
obj={}
对于(变量i=0;i1)
tmp[props[j]]=props[j+1]
其他的
obj=道具[0];
}
返回obj;
}

这里有一个闭包,用于迭代要添加到对象的所有属性列表

无论何时找到新特性,都会创建一个新对象。 该新对象将被发送以进行进一步扩展

每当我们到达属性列表的最后一个值时,它将被指定给当前属性

const propsToAdd = [
    ['propA', 'value'], 
    ['propB', 'propC', 'propD', 'value'],
    ['propB', 'propF', 'value']
];
var addProperties=(函数(){
var addProperties=函数(对象、属性){
var currentProperty=properties.shift();
如果(properties.length==1){
对象[currentProperty]=属性[0];
}
否则{
如果(!object.hasOwnProperty(currentProperty))
对象[currentProperty]={};
addProperties(对象[currentProperty],属性);
}
};
返回函数(对象、属性数组){
propertiesArray.forEach(函数(propertyList){
addProperties(对象、propertyList);
});
};
}());
常量propsToAdd=[
['propA','value'],
['propB','propC','propD','value'],
['propB'、'propF'、'value']
];
var对象={};
addProperties(对象、propsToAdd);

console.log(对象)由于您使用的
const
建议使用ES2015,您可以使用,并且:

const-nest=([x,…xs],o={})=>
xs.length==0?x:(o[x]=nest(xs,o[x]),o;
常量nestmany=([xs,…yss],o={})=>
xs==未定义?o:nestmany(yss,nest(xs,o));
常量propsToAdd=[
['propA','value1'],
['propB','propC','propD','value2'],
['propB','propF','value3']
];

log(nestmany(propsToAdd))属性列表的深度是否有限制?此处的值是否为数字?或字符串“value”@HimmelString value only。是否尝试过?很高兴看到它。@Himmel请验证,如果您有问题,请告诉我。