2012-05-07 76 views
5

(context) Tengo información de un grupo de elementos que estoy recopilando en un objeto JSON que luego pasa a un controlador MVC3 donde se deserializa en un objeto.Crear dinámicamente un objeto JSON anidado

Hay 'elementos' y 'configuración de elemento'. Actualmente, tengo tanto elementos como configuraciones de elementos, todo en un objeto plano JSON. Idealmente, me gustaría tener la configuración del elemento anidada debajo de cada elemento. Mi código actualmente se ve así:.

var editeditems=[]; 
... 

     $("#SaveChanges").click(function() { 

      //this works and retrieves all of the item IDs 
      $(".portlet").each(function() { 

       var itemname = $(this).data("itemname"); 
     editeditems.push(
         { 
          "itemname": itemname 
         }); 

    itemname = $(this).data("itemname"); 

     $(".settingInput").each(function() { 

      editeditems.push(
       { 
       "settingkey":$(this).attr("name"), 
       "settingvalue":$(this).attr("value") 
       }); 


       }); 


}); 

Bajo el $ ("settingInput") cada función es donde se añaden los ajustes. Intenté la sintaxis como 'editedItems.settings.push ..' pero vuelve con un error de sintaxis.

¡Cualquier ayuda sería muy apreciada!

Respuesta

12
var editeditems = []; 
... 

$('#SaveChanges').click(function() { 
    $('.portlet').each(function() { 
     var settings = []; 
     $('.settingInput').each(function() { 
      settings.push({ 
       settingkey: $(this).attr('name'), 
       settingvalue: $(this).attr('value') 
      }); 
     }); 

     editeditems.push({ 
      itemname: $(this).data('itemname'), 
      settings: settings 
     }); 
    }); 

    ... 
}); 

generará salida de ejemplo:

var editeditems = 
[ 
    { 
     "itemname": "item1", 
     "settings": [ 
      { 
       "settingkey": "key1", 
       "settingvalue": "value1" 
      }, 
      { 
       "settingkey": "key2", 
       "settingvalue": "value2" 
      } 
     ] 
    }, 
    { 
     "itemname": "item2", 
     "settings": [ 
      { 
       "settingkey": "key1", 
       "settingvalue": "value3" 
      }, 
      { 
       "settingkey": "key2", 
       "settingvalue": "value4" 
      } 
     ] 
    } 
]; 
+0

Esto funcionó muy bien! ¡Gracias! – Scottingham

3
var ei = {'settings': [3]}; 
ei.settings.push(4); 
console.log(ei); 
// This will output an object with property settings and value an array with values (3 and 4) 
0

Sólo es necesario crear plana matriz de datos JSON como

[{"itemname": "item1","settingkey": "key1","settingvalue": "value1"}, 
{"itemname": "item2","settingkey": "key2","settingvalue": "value2"},]; 

que un simple proceso como este

var keys = Object.keys(dataMap); 

var json = []; 
for (var key in keys) { 
     var innerJson = {}; 
     innerJson["name"] = keys[key]; 
     var innerMap = dataMap[keys[key]]; 

     if (innerMap instanceof Array) { 
      innerJson["size"] = innerMap[0]; 
     } else if (innerMap instanceof Object) { 

      var child = processHirarchiachalData(innerMap); 
      innerJson["children"] = child; 
     } 
     json.push(innerJson); 

} 
Cuestiones relacionadas