Crea un oggetto JSON in modo dinamico tramite JavaScript (senza stringhe concate)


130

Ho questi dati JSON:

{
    "employees": [
        {
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "firstName": "Anna",
            "lastName": "Smith"
        },
        {
            "firstName": "Peter",
            "lastName": "Jones"
        }
    ]
}

Supponiamo di non sapere quante colonne e righe di dipendenti ho, come posso creare questo oggetto in JavaScript (senza stringhe concate)? Supponiamo che ottenga ogni riga nel metodo "onGeneratedRow" e che devo inserire ciascuna colonna (firstName, lastName) tra parentesi '{}'.

var viewData = { 
    employees : [] 
};

var rowNum = -1; 

function onGeneratedRow(columnsResult)
{
    rowNum = rowNum + 1;
    viewData.employees.push({});    
    columnsResult.forEach(function(column) {                  
    var columnName = column.metadata.colName;
    viewData.employees[rowNum][columnName] = column.value;  });
}

1
Che cosa è columnsResult? Che cosa è metadata?
Georg

1
Questa domanda non ha senso per me al momento, puoi spiegarmi ulteriormente, da dove provengono i tuoi dati e in quale formato. Stai solo aggiungendo ai dati esistenti o creando tutto da zero. Forse puoi creare un jsfiddle per dimostrare qual è il problema che stai riscontrando. La tua domanda è davvero giusta, come accedere ai dati all'interno di un array / o oggetto javascript? E permette di essere chiari sui dati, JSON o Javascript oggetto: stackoverflow.com/questions/8294088/javascript-object-vs-json
Xotic750

2
assumere "columnName" è "firstName" e "column.value" è il valore (ad esempio: "John"). Devo solo sapere come inserirli dinamicamente tra parentesi ('{}')
ohadinho,

1
Cosa succede quando esegui il codice che hai mostrato?
nnnnnn,

@ohadinho non è chiaro quale sia la tua struttura di dati di input (json)columnsResult
Kamil Kiełczewski

Risposte:


154

Questo è quello di cui hai bisogno!

function onGeneratedRow(columnsResult)
{
    var jsonData = {};
    columnsResult.forEach(function(column) 
    {
        var columnName = column.metadata.colName;
        jsonData[columnName] = column.value;
    });
    viewData.employees.push(jsonData);
 }

Come sapevi che l'OP non ha bisogno di contare le righe con "rowNum "?
Xotic750,

1
il push non ha bisogno del numero di riga
Waqar Alamgir

poiché la generazione JSON non ha bisogno di contare, più puoi sempre usare .length per ottenere righe.
Waqar Alamgir,

5
Non ho mai detto che lo faccia la generazione JSON. È stato più il caso che hai dichiarato "Questo è quello che ti serve!", Ma volevo sapere come sapevi che il conteggio non era necessario all'OP, o hai semplicemente supposto? La tua risposta non genera JSON tra l'altro.
Xotic750,

1
@WaqarAlamgir - questo è esattamente ciò di cui avevo bisogno in questo momento. Saluti!
bob.mazzo,

96

Forse queste informazioni ti aiuteranno.

var sitePersonel = {};
var employees = []
sitePersonel.employees = employees;
console.log(sitePersonel);

var firstName = "John";
var lastName = "Smith";
var employee = {
  "firstName": firstName,
  "lastName": lastName
}
sitePersonel.employees.push(employee);
console.log(sitePersonel);

var manager = "Jane Doe";
sitePersonel.employees[0].manager = manager;
console.log(sitePersonel);

console.log(JSON.stringify(sitePersonel));


10

Questo argomento, in particolare la risposta di Xotic750, mi è stato molto utile. Volevo generare una variabile json per passarla a uno script php usando ajax. I miei valori erano memorizzati in due array e li volevo in formato json. Questo è un esempio generico:

valArray1 = [121, 324, 42, 31];
valArray2 = [232, 131, 443];
myJson = {objArray1: {}, objArray2: {}};
for (var k = 1; k < valArray1.length; k++) {
    var objName = 'obj' + k;
    var objValue = valArray1[k];
    myJson.objArray1[objName] = objValue;
}
for (var k = 1; k < valArray2.length; k++) {
    var objName = 'obj' + k;
    var objValue = valArray2[k];
    myJson.objArray2[objName] = objValue;
}
console.log(JSON.stringify(myJson));

Il risultato nel registro della console dovrebbe essere simile al seguente:

{
   "objArray1": {
        "obj1": 121,
        "obj2": 324,
        "obj3": 42,
        "obj4": 31
   },
   "objArray2": {
        "obj1": 232,
        "obj2": 131,
        "obj3": 443
  }
}

2
Posso sottolineare l'utilità di spaziare correttamente il codice che invii qui? È molto più difficile da leggere senza spaziatura.
Kevin Lewis,

1
Questo mi ha aiutato a non finire. Esattamente quello che ho richiesto.
Derek,

-1

JavaScript

var myObj = {
   id: "c001",
   name: "Hello Test"
}

Risultato (JSON)

{
   "id": "c001",
   "name": "Hello Test"
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.