复合对象遍历替换属性名

43 阅读1分钟
复合对象遍历替换属性名

假设我们有一个复合对象,如下所示:

```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) {
  // 如果 obj 不是对象或者数组,直接返回
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  // 如果 obj 是数组,遍历数组并递归调用 replaceKeys 函数
  if (Array.isArray(obj)) {
    return obj.map(item => replaceKeys(item, keyMap));
  }
  // 如果 obj 是对象,遍历对象并递归调用 replaceKeys 函数
  const newObj = {};
  for (let key in obj) {
    // 如果 key 在 keyMap 中有对应的映射,使用映射后的 key
    const newKey = keyMap[key] || key;
    newObj[newKey] = replaceKeys(obj[key], keyMap);
  }
  return newObj;
}

// 调用 replaceKeys 函数并传入 keyMap
const newobj = replaceKeys(obj, {
  name: 'firstName',
  'address.city': 'address.town'
});

console.log(newobj);
// 输出:
// {
//   firstName: 'John',
//   age: 30,
//   address: {
//     street: '123 Main St',
//     town: 'New York',
//     state: 'NY',
//     zip: '10001'
//   },
//   hobbies: ['reading', 'traveling']
// }
```

在上面的代码中,我们定义了一个 `replaceKeys` 函数,它接受两个参数:一个对象或数组,以及一个键名映射表。在函数内部,我们首先判断传入的参数是否是对象或数组,如果不是,直接返回原值。如果是数组,我们使用 `Array.map` 方法遍历数组并递归调用 `replaceKeys` 函数。如果是对象,我们使用 `for...in` 循环遍历对象并递归调用 `replaceKeys` 函数。在遍历过程中,如果当前属性名在键名映射表中有对应的映射,我们使用映射后的属性名。最后,我们返回一个新的对象或数组,其中所有的属性名都已经被替换了。