首页 > 解决方案 > 如何在javascript中动态重命名嵌套对象数组中的对象键

问题描述

我需要在对象 JavaScript 的嵌套数组中动态重命名对象键名,我曾尝试使用此代码。这也是我仅从 Stack Overflow 获得的,但这不起作用,这意味着它只检查第一级而不进行深度替换。

const node = {
  'id': 'de603a3e',
  'name': 'erewr',
  'subGroups': [
     {
        'id': '83d7c7e4',
        'name': 'dfds',
        'subGroups': [ ]
     },
     {
        'id': '050cde96',
        'name': 'tetwet',
        'subGroups': [ ]
     },
     {
        'id': 'd67cc4e8',
        'name': 'wewqe',
        'subGroups': [
           {
              'id': '553c301d',
              'name': 'ewqe',
              'subGroups': [

              ]
           }
        ]
     },
     {
        'id': '5d5ae5f2',
        'name': 'rwq',
        'subGroups': [
           {
              'id': 'ff29ad54',
              'name': 'wqe',
              'subGroups': [

              ]
           },
           {
              'id': '5d013943',
              'name': 'weqe',
              'subGroups': [

              ]
           }
        ]
     }
  ]
}

console.log(renameKey(node, { subGroups: 'subordinates' }))

renameKey(obj, keysMap) { 
    return transform(obj, function(result, value, key) { 
      const currentKey = keysMap[key] || key; 
      result[currentKey] = isObject(value) ? this.renameKey(value, keysMap) : value; 
    });
  }

我在 TypeScript 中使用此代码。 注意transform并且isObject是 lodash

我收到错误ERROR TypeError: Cannot read property 'replaceKeysDeep' of undefined

标签: javascripttypescriptlodash

解决方案


这应该工作

function renameKeys(node, keysMaps) {
    if(!isObject(node)) return node
    if(Array.isArray(node)) return node.map(item => renameKeys(item, keysMaps))

    return Object.entries(node).reduce((result, [key, value]) => {
        const newKey = keysMaps[key] || key;
        return {
            ...result,
            [newKey]: renameKeys(value, keysMaps)

        };
    }, {});
}

推荐阅读