代码之家  ›  专栏  ›  技术社区  ›  mamesaye

json对象字符串的javascript数组

  •  -3
  • mamesaye  · 技术社区  · 8 年前

    我有这个阵列:

    data = [
        "Id = 2",
        "time = 10:59",
        "Topic = xxxxxxxxxxxxxxxx",
        "GUEST3",
        "Role = GS",
        "Infos = Connecticut",
        "GUEST4",
        "Role = HS",
        "Infos = Delaware",
        "GUEST5",
        "Role = CS",
        "Infos = Hawaii"
    ]   
    

    如何使其成为如下JSON对象:

    data = [   
     {    
        Id : 2,  
        time : 10:5',
        Topic : xxxxxxxxxxxxxxxx,  
        GUEST3:
               {
                 Role : GS,
                 Infos : Connecticut,
               }
       GUEST4:
               {
                Role : HS,
                Infos : Delaware,  
       GUEST5:
               {
                Role : CS,
                Infos : Hawaii
               }
     }
    
    3 回复  |  直到 8 年前
        1
  •  4
  •   Andrew Bone    8 年前

    这里有一些代码可以做到这一点。

    我已经对代码进行了注释,但基本要点是它将查看数组中的每个字符串,然后确定它是键和值还是对象的另一层。

    const data = ["Id = 2", "time = 10:59", "Topic = xxxxxxxxxxxxxxxx", "GUEST3", "Role = GS", "Infos = Connecticut", "GUEST4", "Role = HS", "Infos = Delaware", "GUEST5", "Role = CS", "Infos = Hawaii"];
    
    // Declaring new object
    let obj = {};
    // Place to remember current level of object
    let level;
    
    // For every bit of the array
    for (let item of data) {
      // If it contains an equals
      if (item.includes('=')) {
        // Split it into two stings
        let split = item.split('=');
        let key = split[0].trim();
        let cont = split[1].trim();
        // If we're already on a lower level like GUEST3 put it in there
        if (level) {
          obj[level][key] = cont
        } else {
          // Or just place the new data at the top level
          obj[key] = cont
        }
      } else {
        // If there's no equals we want to go down a layer
        level = item;
        obj[item] = {};
      }
    }
    
    console.log(obj)

    如果你很难理解到底发生了什么,我希望这对你有所帮助。请随时发表评论。

    编辑:

    我把这三个答案混在一起了,你可以做出一个更好的答案。

    const data = ["Id = 2", "time = 10:59", "Topic = xxxxxxxxxxxxxxxx", "GUEST3", "Role = GS", "Infos = Connecticut", "GUEST4", "Role = HS", "Infos = Delaware", "GUEST5", "Role = CS", "Infos = Hawaii"]
    
    let aO = o = {};
    data.map(a => a.split(' = ')).forEach(e => {e.length > 1 ? aO[e[0]] = e[1] : aO = o[e] = {}});
    console.log(o);
        2
  •  3
  •   Andrew Bone    8 年前

    注意:您的输入数组看起来非常不寻常和非标准。如果这确实是您接收数据的方式,那么您可以使用下面的代码来处理它。但是,我建议您进行双重检查,如果可能的话,尝试更改后端(或此数据来自哪里),以提供标准JSON字符串或JavaScript对象。

    var data = [
      "Id = 2",
      "time = 10:59",
      "Topic = xxxxxxxxxxxxxxxx",
      "GUEST3",
      "Role = GS",
      "Infos = Connecticut",
      "GUEST4",
      "Role = HS",
      "Infos = Delaware",
      "GUEST5",
      "Role = CS",
      "Infos = Hawaii"
    ];
    
    var result = {};
    var putInto = result;
    for (let token of data) {
      if (token.indexOf('=') != -1) {
        let nameValue = token.split('=');
        let name = nameValue[0].trim();
        let value = nameValue[1].trim();
        putInto[name] = value;
      } else {
        let child = {};
        result[token] = child;
        putInto = child;
      }
    }
    
    console.log(result)
        3
  •  1
  •   Luiz Fernando da Silva    8 年前

    首先,您需要正确格式化数据。一种方法是将它和数组组合起来。

    const str =  ["Id = 2","time = 10:59","Topic = xxxxxxxxxxxxxxxx","GUEST3","Role = GS" ,"Infos = Connecticut","GUEST4","Role = HS","Infos = Delaware","GUEST5","Role = CS","Infos = Hawaii"]
    
    const formatted = str.map(e => e.split('='))
    

    然后你可以使用 _.fromPairs 来自lodash

    const obj = _.fromPairs(formatted);
    

    您得到了一个简单的json。这并不完全是你需要的,但你可以从这里开始。