JS递归替换属性
替换前
let 李华 = {
姓名 : "李华" ,
关系 : "本人" ,
年龄 : 20 ,
孩子 : [
{
姓名 : "李华儿子" ,
关系 : "儿子" ,
年龄 : 10 ,
孩子 : [
{
姓名 : "李华儿子的儿子" ,
关系 : "孙子" ,
年龄 : 5 ,
孩子 : [ ]
} ,
]
} ,
{
姓名 : "李华女儿" ,
关系 : "女儿" ,
年龄 : 10 ,
孩子 : [
{
姓名 : "李华女儿的女儿" ,
关系 : "孙女" ,
年龄 : 5 ,
孩子 : [ ]
} ,
]
}
]
}
替换后
{
"name" : "李华" ,
"children" : [
{
"name" : "李华儿子" ,
"children" : [
{
"name" : "李华儿子的儿子" ,
"children" : [ ]
}
]
} ,
{
"name" : "李华女儿" ,
"children" : [
{
"name" : "李华女儿的女儿" ,
"children" : [ ]
}
]
}
]
}
实现
function replaceTreeAttr ( obj, arr, isDeal ) {
let newObj = { } ;
let oldValArr = arr. map ( item => item. oldVal) ;
for ( const key in obj) {
if ( isDeal && ! oldValArr. includes ( key) ) {
newObj[ key] = obj[ key]
}
}
for ( let i = 0 ; i < arr. length; i++ ) {
if ( typeof arr[ i] . oldVal !== "string" ) {
throw new Error ( "oldVal必须是字符串" ) ;
}
if ( typeof arr[ i] . newVal !== "string" ) {
throw new Error ( "newVal必须是字符串" ) ;
}
if ( Array. isArray ( obj[ arr[ i] . oldVal] ) ) {
newObj[ arr[ i] . newVal] = JSON . parse ( JSON . stringify ( obj[ arr[ i] . oldVal] ) ) ;
for ( let j = 0 ; j < obj[ arr[ i] . oldVal] . length; j++ ) {
newObj[ arr[ i] . newVal] [ j] = replaceTreeAttr ( obj[ arr[ i] . oldVal] [ j] , arr, isDeal) ;
}
} else {
newObj[ arr[ i] . newVal] = obj[ arr[ i] . oldVal]
}
}
return newObj;
}
console. log ( replaceTreeAttr ( 李华, [ { oldVal : "姓名" , newVal : "name" } , { oldVal : "孩子" , newVal : "children" } ] , false ) ) ;