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请验证,如果您有问题,请告诉我。