js递归算法

面条打包子
  • 2
新手上路,请多包涵

如下数据结构

{
  
"physicalmachineAddTypes": {
      "scriptAdd": {
        "label": "托管",
        "desc": "托管:用于托管已有操作系统的服务器,托管后将同时生成物理机和裸金属记录"
      },
      "preAdd": {
        "label": "预注册",
        "desc": "预注册:用于预上架未配置 BMC 信息的服务器,通过预注册功能配置服务器基本信息,待服务器上电后, MAC 信息匹配即可进行注册并配置 BMC 信息等"
      },
      "isoAdd": {
        "label": "ISO引导注册",
        "desc": "ISO引导注册:用于立即注册已配置 BMC 信息的服务器,该功能不要求服务器处于 DHCP relay 网络环境,但是要求服务器支持 Redfish 功能"
      },
      "pxeAdd": {
        "label": "PXE引导注册",
        "desc": "PXE引导注册:用于立即注册已配置 BMC 信息的服务器,要求服务器处于 DHCP relay 网络环境"
      }
    },
    "http_proxy": "Http代理",
     "https_proxy": "Https代理"

}
```~~~~

想求结果

{
    "托管": "physicalmachineAddTypes.scriptAdd.label",
     "托管:用于托管已有操作系统的服务器,托管后将同时生成物理机和裸金属记录": "physicalmachineAddTypes.scriptAdd.desc",
     
     ....
     "Http代理": "http_proxy",
     "https_proxy": "Https代理"
}

如何递归拿到这样的 value: keys呢???

回复
阅读 1.6k
5 个回答
let res = {}
function dfs (obj, path) {
  for (const key in obj) {
    let item = obj[key]
    let prefix = path && '.' || ''
    let newpath = `${path}${prefix}${key}`
    if (typeof item === 'string') {
      res[item] = newpath
    } else {
      dfs(item, newpath)
    }
  }
}
dfs({}, '')
asseek
  • 9.4k
const deepPath = (obj, resultObj = {}, paths = []) => {
  for (const key in obj) {
    if (typeof obj[key] === 'object') {
      deepPath(obj[key], resultObj, [...paths, key]);
    } else {
      resultObj[obj[key]] = [...paths, key].join('.');
    }
  }
  return resultObj;
};
const obj = {
  'physicalmachineAddTypes': {
    'scriptAdd': {
      'label': '托管',
      'desc': '托管:用于托管已有操作系统的服务器,托管后将同时生成物理机和裸金属记录',
    },
    'preAdd': {
      'label': '预注册',
      'desc': '预注册:用于预上架未配置 BMC 信息的服务器,通过预注册功能配置服务器基本信息,待服务器上电后, MAC 信息匹配即可进行注册并配置 BMC 信息等',
    },
    'isoAdd': {
      'label': 'ISO引导注册',
      'desc': 'ISO引导注册:用于立即注册已配置 BMC 信息的服务器,该功能不要求服务器处于 DHCP relay 网络环境,但是要求服务器支持 Redfish 功能',
    },
    'pxeAdd': {
      'label': 'PXE引导注册',
      'desc': 'PXE引导注册:用于立即注册已配置 BMC 信息的服务器,要求服务器处于 DHCP relay 网络环境',
    },
  },
  'http_proxy': 'Http代理',
  'https_proxy': 'Https代理',
};

const result = deepPath(obj);
console.log(result);

应该是想做成 {值:路径} 吧?

let result = {};
function map(obj, parent) {
  Object.keys(obj).forEach(key => {
     if (typeof obj[key] !== 'object') { result[obj[key]] = (parent ? (parent + '.' + key) : key); return    }
     map(obj[key], parent ? (parent + '.' + key) : key);
  })
}

let temp = {
"physicalmachineAddTypes": {
      "scriptAdd": {
        "label": "托管",
        "desc": "托管:用于托管已有操作系统的服务器,托管后将同时生成物理机和裸金属记录"
      },
      "preAdd": {
        "label": "预注册",
        "desc": "预注册:用于预上架未配置 BMC 信息的服务器,通过预注册功能配置服务器基本信息,待服务器上电后, MAC 信息匹配即可进行注册并配置 BMC 信息等"
      },
      "isoAdd": {
        "label": "ISO引导注册",
        "desc": "ISO引导注册:用于立即注册已配置 BMC 信息的服务器,该功能不要求服务器处于 DHCP relay 网络环境,但是要求服务器支持 Redfish 功能"
      },
      "pxeAdd": {
        "label": "PXE引导注册",
        "desc": "PXE引导注册:用于立即注册已配置 BMC 信息的服务器,要求服务器处于 DHCP relay 网络环境"
      }
    },
    "http_proxy": "Http代理",
     "https_proxy": "Https代理"

}

map(temp, '');

console.log(result);
面条打包子
  • 2
新手上路,请多包涵

为什么我看不见答案呢?

仅针对题主提出的问题,若数据源格式有变化或者有其它类型介入,可能需要添加逻辑:

let data = {
    "physicalmachineAddTypes": {
        "scriptAdd": {
            "label": "托管",
            "desc": "托管:用于托管已有操作系统的服务器,托管后将同时生成物理机和裸金属记录"
        },
        "preAdd": {
            "label": "预注册",
            "desc": "预注册:用于预上架未配置 BMC 信息的服务器,通过预注册功能配置服务器基本信息,待服务器上电后, MAC 信息匹配即可进行注册并配置 BMC 信息等"
        },
        "isoAdd": {
            "label": "ISO引导注册",
            "desc": "ISO引导注册:用于立即注册已配置 BMC 信息的服务器,该功能不要求服务器处于 DHCP relay 网络环境,但是要求服务器支持 Redfish 功能"
        },
        "pxeAdd": {
            "label": "PXE引导注册",
            "desc": "PXE引导注册:用于立即注册已配置 BMC 信息的服务器,要求服务器处于 DHCP relay 网络环境"
        }
    },
    "http_proxy": "Http代理",
    "https_proxy": "Https代理"
}

function fn(data) {
    let result = {}
    for (let key in data) {
        _recursiveFn(key, data[key], key, result);
    }
    return result;
}

function _recursiveFn(key, obj, chainKey, result) {
    if (Reflect.toString.call(obj) === '[object Object]') {
        for (let k in obj) {
            _recursiveFn(k, obj[k], `${chainKey}.${k}`, result)
        }
    } else {
        result[obj] = chainKey;
    }
    return false
}
console.log(fn(data));
宣传栏