代码之家  ›  专栏  ›  技术社区  ›  Benni Russell

动态地将字符串转换为对象

  •  0
  • Benni Russell  · 技术社区  · 6 年前

    我有一个API返回以下字符串

    styles: "background #2b2b2b; color: #FFFFFF"
    

    我需要把它快速转换成这样的物体

    styles: { background: '#2b2b2b', color: '#FFFFFF' }
    

    如何最好地做到这一点

    3 回复  |  直到 6 年前
        1
  •  1
  •   Slai    6 年前

    正则表达式替换 https://regex101.com/r/ZmAW1m

    var o = {}, s = "background #2b2b2b; color: #FFFFFF"
    
    s.replace(/([^: ]+)[: ]+([^; ]+)[; ]*/g, (m, k, v) => o[k] = v)
    
    console.log(o)
        2
  •  3
  •   CodeDraken    6 年前

    询问前请先搜索一下。人们现在会把你的问题打分。但无论如何,这里有一个答案…

    const str = "background #2b2b2b; color: #FFFFFF"
    const obj = str.split('; ').reduce((acc, keyVal) => {
      const [key, val] = keyVal.split(' ')
      acc[key] = val
      return acc
    }, {})
    
    console.log(obj) // {background: "#2b2b2b", color:: "#FFFFFF"}
    
    // if str was just 'background #2b2b2b;' it would include the ;
    // {background: "#2b2b2b;"}
    

    正如有人提到的,您的字符串不一致,因此您需要修复字符串格式或添加处理边缘情况的方法。

    更新: 也许更灵活的方法是使用regexp。我不是最擅长写regexps,所以它可能会得到改进。

    // add acceptable characters in the brackets [ ]
    const re = /([a-z-]+):\s?([()'"#a-z0-9]+);/gi
    
    const str = 'background: #2b2b2b; color: #FFFFFF;background-url: url("test");'
    const styles = {}
    
    let next
    
    while ((next = re.exec(str)) !== null) {
      const key = next[1]
      const value = next[2]
      // or const [ _, key, value ] = next
    
      styles[key] = value
    }
    
    console.log(styles)
    
    /*
    {
      background: '#2b2b2b',
      color: '#FFFFFF',
      'background-url': 'url("test")'
    }
    */
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

        3
  •  -1
  •   hjbello    6 年前

    你可以转换

    let styles = "background #2b2b2b; color: #FFFFFF";
    

    进入之内

    stylesObj = {background: styles.split(";")[0].trim().split(" ")[1], 
                           color: styles.split(";")[1].trim().split(" ")[1]}
    
    // {background: "#2b2b2b", color: "#FFFFFF"}
    

    你应该以你想要的形式得到它。

    编辑

    增加了 .trim() ,否则,如果字符串有多余的空格,则不起作用。