复合对象遍历替换属性名
假设我们有一个复合对象,如下所示:
```javascript
const obj = {
name: 'John',
age: 30,
address: {
street: '123 Main St',
city: 'New York',
state: 'NY',
zip: '10001'
},
hobbies: ['reading', 'traveling']
};
```
现在,我们想要遍历这个对象并替换属性名,例如将 `name` 改为 `firstName`,将 `address.city` 改为 `address.town`。我们可以使用递归函数来实现这个操作,如下所示:
```javascript
function replaceKeys(obj, keyMap) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(item => replaceKeys(item, keyMap));
}
const newObj = {};
for (let key in obj) {
const newKey = keyMap[key] || key;
newObj[newKey] = replaceKeys(obj[key], keyMap);
}
return newObj;
}
const newobj = replaceKeys(obj, {
name: 'firstName',
'address.city': 'address.town'
});
console.log(newobj);
```
在上面的代码中,我们定义了一个 `replaceKeys` 函数,它接受两个参数:一个对象或数组,以及一个键名映射表。在函数内部,我们首先判断传入的参数是否是对象或数组,如果不是,直接返回原值。如果是数组,我们使用 `Array.map` 方法遍历数组并递归调用 `replaceKeys` 函数。如果是对象,我们使用 `for...in` 循环遍历对象并递归调用 `replaceKeys` 函数。在遍历过程中,如果当前属性名在键名映射表中有对应的映射,我们使用映射后的属性名。最后,我们返回一个新的对象或数组,其中所有的属性名都已经被替换了。