Twórz obiekty JSON dynamicznie za pomocą JavaScript (bez ciągów konkate)

134

Mam te dane JSON:

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

Załóżmy, że nie wiem, ile mam kolumn i wierszy pracowników, jak utworzyć ten obiekt w JavaScript (bez ciągów konkatowych)? Załóżmy, że otrzymuję każdy wiersz w metodzie „onGeneratedRow” i muszę wcisnąć każdą kolumnę (firstName, lastName) w nawiasy „{}”.

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;  });
}
ohadinho
źródło
1
Co to jest columnsResult? Co to jest metadata?
georg
1
Te pytania nie mają dla mnie obecnie sensu, czy możesz wyjaśnić dalej, skąd pochodzą Twoje dane i w jakim formacie. Czy po prostu dodajesz do istniejących danych, czy tworzysz je wszystkie od podstaw. Może możesz stworzyć jsfiddle, aby zademonstrować, jaki masz problem. Czy Twoje pytanie jest naprawdę proste, jak uzyskać dostęp do danych w tablicy / lub obiekcie javascript? I
wyjaśnijmy
2
załóżmy, że „nazwa_kolumny” to „nazwa_kolumny”, a „wartość.kolumny” to wartość (na przykład: „Jan”). Muszę tylko wiedzieć, jak dynamicznie wepchnąć je w nawiasy ('{}')
ohadinho
1
Co się stanie, gdy uruchomisz pokazany kod?
nnnnnn
@ohadinho nie jest jasne, jaki jest Twój Strucuture dane wejściowe (JSON)columnsResult
Kamil Kiełczewski

Odpowiedzi:

160

To jest to, czego potrzebujesz!

function onGeneratedRow(columnsResult)
{
    var jsonData = {};
    columnsResult.forEach(function(column) 
    {
        var columnName = column.metadata.colName;
        jsonData[columnName] = column.value;
    });
    viewData.employees.push(jsonData);
 }
Waqar Alamgir
źródło
Skąd wiedziałeś, że PO nie musi liczyć wierszy za pomocą „rowNum ”?
Xotic750
1
push nie wymaga numeru wiersza
Waqar Alamgir
ponieważ generowanie json nie wymaga count, więcej zawsze możesz użyć .length, aby uzyskać wiersze.
Waqar Alamgir
5
Nigdy nie powiedziałem, że tak jest w przypadku generacji JSON. Bardziej chodziło o to, że stwierdzasz: „To jest to, czego potrzebujesz!”, Ale chciałem wiedzieć, skąd wiesz, że liczba ta nie jest potrzebna przez PO, czy po prostu założyłeś? Twoja odpowiedź nie generuje JSON przy okazji.
Xotic750
1
@WaqarAlamgir - dokładnie tego potrzebowałem w tej chwili. Twoje zdrowie!
bob.mazzo
102

Być może te informacje ci pomogą.

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));

Xotic750
źródło
12

Ten temat, zwłaszcza odpowiedź Xotic750, był dla mnie bardzo pomocny. Chciałem wygenerować zmienną JSON, aby przekazać ją do skryptu PHP przy użyciu AJAX. Moje wartości były przechowywane w dwóch tablicach i chciałem, aby były w formacie json. To jest ogólny przykład:

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));

Wynik w dzienniku konsoli powinien wyglądać mniej więcej tak:

{
   "objArray1": {
        "obj1": 121,
        "obj2": 324,
        "obj3": 42,
        "obj4": 31
   },
   "objArray2": {
        "obj1": 232,
        "obj2": 131,
        "obj3": 443
  }
}
efekt motyla
źródło
2
Czy mogę podkreślić użyteczność odpowiedniego rozmieszczenia kodu, który tu przesyłasz? Dużo trudniej jest czytać bez odstępów.
Kevin Lewis
1
To pomogło mi bez końca. Dokładnie to, czego potrzebowałem.
Derek
-2

JavaScript

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

Wynik (JSON)

{
   "id": "c001",
   "name": "Hello Test"
}
Ishan Lakshitha
źródło