2015-06-11 2 views
0

Это мой объект:Как переименовать некоторые ключевые имена в объекте JSON

{ 
    "title": "title", 
    "Components": [{ 
     "title": "component 1", 
     "id": 0, 
     "contents": { 
      "1": { 
       "title": "sub-component 1", 
       "sub_contents": { 
        "1": { 
         "title": "blah", 
        } 
       } 
      }, 
      "2": { 
       "title": "sub-component 1", 
       "sub_contents": { 
        "3": { 
         "title": "blah", 
        } 
       } 
      } 
     } 
    }] 
} 

объектов в sub_contents объект каждый запуск со свойством, которое является числом. Соответствующая программа требует, чтобы эти числа находились в последовательности по всему JSON. Как вы можете видеть, он запускает sub_contents -> 1, затем идет sub_contents -> 3. Мне нужно написать функцию, которая пересекает все это и перегруппирует их все, начиная с 1. Я действительно не уверен, как это сделать. Кажется, я могу получить имя ключа, но не установить его.

Мой код:

function reindex_manifest(manifest){ 
var index = 1; 

     $.each(manifest.Components, function(i) { 
      $.each(manifest.Components[i].contents, function(n) { 
       var obj = manifest.Components[i].contents[n].sub_contents; 
       for (var key in obj) { 
        // I CAN READ THE KEY HERE BUT HOW DO I CHANGE IT TO THE 
        // VALUE OF THE INDEX VARIABLE?? 
        console.log(key); 
       } 
      }); 
     }); 
} 

ответ

0

Один быстрый подход:

Вы должны удалить старый ключ, дубликат пары ключ-значение с новым данным именем ключа, и верните его обратно на свой объект.

Кроме того, чтобы это произошло без возникновения конфликтов, вам необходимо отключиться от each, где вы не можете мутировать переменную. См. Мой пример ниже:

function reindex_manifest(manifest){ 
    for (var i in manifest.Components){ 
     var contentKeys = Object.keys(manifest.Components[i].contents); 
     for (var k of contentKeys){ 

      var content = manifest.Components[i].contents[k]; 
      var subcontent = manifest.Components[i].contents[k].sub_contents; 

      // Check the subcontent key agains the content key 
      var subcontent_key = Object.keys(subcontent)[0]; 
      if (subcontent_key !== k){ 
       // Re-sequence it, and replace the old one 
       subcontent[k] = subcontent[subcontent_key]; 
       subcontent[subcontent_key] = null; 
       delete subcontent[subcontent_key]; 

       // Update the root 
       manifest.Components[i].contents[k].sub_contents = subcontent; 
      } 
     } 
    } 

}