Javascript создать вложенный массив JSON из массива - PullRequest
0 голосов
/ 05 мая 2018

У меня есть этот массив:
myArray = ["Id = 1", "Time = 18:40", "Topic = yyyyyyyyyyyy", "GUEST", "Role = HS", "Infos = Arizona", "Role = GS", "Infos = Arizona" , "Role = GS", "Infos = Colorado", "Id = 2", "Time = 11:32", "Topic = xoxo", "GUEST", "Role" = "GS", "Infos = California" , "Роль = CS", "Информация = Мэриленд", "Роль = GS", "Информация = Невада"];

Я хочу создать из него вложенный массив JSON:

myJson = [
{  
 "Id" : "1",
 "Time" : "18:40",
 "Topic" : "yyyyyyyyyyyy",
 "GUEST":
 [
   {"Role" : "HS",
   "Infos" : "Arizona"},
   {"Role" : "GS",
   "Infos" : "Arizona"},
   {"Role" : "HS",
   "Infos" : "Colorado"}
 ]
},
{  
 "Id" : "2",
 "Time" : "11:32",
 "Topic" : "xoxo",
 "GUEST":
 [
   {"Role" : "GS",
   "Infos" : "California"},
   {"Role" : "CS",
   "Infos" : "Maryland"},
   {"Role" : "GS",
   "Infos" : "Nevada"}
 ]
}
]  

Как я могу это сделать? попробовал код ниже без успеха.

myArray = ["Id = 1","Time = 18:40","Topic = yyyyyyyyyyyy","GUEST","Role = HS","Infos = Arizona","Role = GS","Infos = Arizona","Role = GS","Infos = Colorado","Id = 2","Time = 11:32","Topic = xoxo","GUEST","Role" = "GS","Infos = California","Role = CS","Infos = Maryland","Role = GS","Infos = Nevada"];

// Declaring new object
			let obj = {};
			// Place to remember current level of object
			let level;
			myJson = [];
			for (let item of this.myArray) {
			  // If it contains an equals
			  if (item.includes('=')) {
			    // Split it into two stings
			    let split = item.split('=');
			    let key = split[0].trim();
			    let val = split[1].trim();
			    // If we're already on a lower level like GUEST3 put it in there
			    if (level) {
			      obj[level][key] = val
			    } else {
			      // Or just place the new data at the top level
			      obj[key] = val
			    }
			  } else {
			    // If there's no equals we want to go down a layer
			    level = item;
			    myJson.push(obj[item]);
			  }
			}

console.log("myJson : "+ JSON.stringify(myJson));

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Другой ответ совершенно верен - запрашиваемый вами формат совершенно неверен. Если бы это было бы просто на один объект глубже, когда вы встречаете строку "GUEST" и создаете новый объект в выводе, когда встречаете следующую строку "Id = \d+", вы можете использовать что-то вроде:

  let process = (arr) => {
    let path = [];
    const data = [];
    let o = data;
    while (arr && arr.length) {
      let item = arr.shift();
      let key= null;
      let value = null;

      if (/Id = \d+/.test(item)) {
        o = {};
        data.push(o);
        let pair = item.split(' = ');
        o.Id = pair[1];      
      } 
      else if (item == "GUEST") {
        o["GUEST"] = {};
        o = o["GUEST"]      
        value = {};      
      } else {
        let pair = item.split(' = ');
        o[pair[0]] = pair[1];       
      }      
    }  
    return data;
  }

Однако при таком подходе ваши дубликаты ключей будут переопределены следующим образом:

 [
    {
      "Id": "1",
      "Time": "18:40",
      "Topic": "yyyyyyyyyyyy",
      "GUEST": {
        "Role": "GS",
        "Infos": "Colorado"
      }
    },
    {
      "Id": "2",
      "Time": "11:32",
      "Topic": "xoxo",
      "GUEST": {
        "Role": "GS",
        "Infos": "Nevada"
      }
    }
  ]

Я думаю, что это хорошее начало, и вы можете точно настроить партию GUEST по своему вкусу.

0 голосов
/ 05 мая 2018

Неправильный формат JSON.

  1. Массив пар «ключ-значение» не допускается в JSON.
  2. Массив пары ключ-значение не может иметь одинаковый ключ имени.

Изменить на следующий формат (JSON предъявляет строгие требования к формату):

myJson = [
{  
 "Id" : "1",
 "Time" : "18:40",
 "Topic" : "yyyyyyyyyyyy",
 "GUEST":
 [
   {
     "Role" : "HS",
     "Infos" : "Arizona"
   },
   {
     "Role" : "GS",
     "Infos" : "Arizona"
   },
   {
     "Role" : "HS",
    "Infos" : "Colorado"
   }
 ]
}
]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...