Symbol 转换


  • 0
    administrators

    请你完成 convertSymbolToNormalStr 函数,它会把一个键全是 Symbol 的对象转换成键全是 String 的对象,而同时值保持不变。例如:

    convertSymbolToNormalStr({ [Symbol('name')]: 'Jerry' }) // => { name: 'Jerry' }
    

  • 0

    @胡子大哈 提示信息说结果不正确,但是我自己在本地跑的结果没错0_1496715127045_upload-4c1a4732-5961-4378-adf1-44e1cae47efa


  • 0
    administrators

    @maroon 你看你一下是不是处理字符串的时候有些情况没有考虑清楚。


  • 1
    管理员

    遍历对象的symbol属性要用Object.getOwnPropertySymbols(obj)方法:

    const convertSymbolToNormalStr = obj => {
      Object.getOwnPropertySymbols(obj).forEach(symbol => {
        (typeof obj[symbol] === 'object') && convertSymbolToNormalStr(obj[symbol]);
        let key = symbol.toString().match(/\((.*)\)/)[1];
        obj[key] = obj[symbol];
        delete obj[symbol]
      })
      return obj
    }
    

  • -2

    const convertSymbolToNormalStr = obj => {
    	Reflect.ownKeys(obj).forEach(d => {
    		typeof d == 'object' && convertSymbolToNormalStr(d)
    		if (typeof d === 'symbol') obj[d.toString().slice(7 ,-1)] = obj[d]
    	})
    	return obj
    }
    

  • -2

    const convertSymbolToNormalStr = obj => {
      Reflect.ownKeys(obj).forEach(d => {
        if (typeof d === 'symbol') {
          obj[d.toString().replace(/^Symbol\(|\)$/g, '')] = obj[d];
          delete obj[d];
        } else if (typeof d === 'object') convertSymbolToNormalStr(d)
      })
      return obj;
    }

  • 1

    /**
     * 考点:
     * 遍历对象的symbol key,使用Object.getOwnPropertySymbol,或Reflect.ownKeys
     */
    var convertSymbolToNormalStr = (obj) => {
      let result = {}
      for (let key of Reflect.ownKeys(obj)) {
        let value = obj[key]
        // 如果key是Symbol类型,则转换key
        if (typeof key === 'symbol') {
          // key = key.toString().match(/\((\w+)\)/)[1]
          key = key.toString().slice(7, -1)
        }
        // (题目的小坑...)如果value是个纯对象,which也需要递归的情况
        if (typeof value === 'object' && !Array.isArray(value)) {
          value = convertSymbolToNormalStr(value)
        }
        result[key] = value
      }
      return result
    }
    

  • 0

    运行时不支持 Symbol.prototype.description 这个 getter,只能强行 toString……


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待