Crear objeto JSON dinámicamente a través de JavaScript (sin concatenar cadenas)

130

Tengo estos datos JSON:

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

Supongamos que no sé cuántas columnas y filas de empleados tengo, ¿cómo creo este objeto en JavaScript (sin cadenas de concatenación)? Suponga que obtengo cada fila en el método "onGeneratedRow", y necesito empujar cada columna (firstName, lastName) a los corchetes '{}'.

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
fuente
1
¿Qué es columnsResult? ¿Qué es metadata?
georg
1
Estas preguntas no tienen sentido para mí en este momento, ¿puede explicarme más de dónde provienen sus datos y en qué formato? ¿Está agregando datos existentes o creando todos ellos desde cero? Tal vez pueda crear un jsfiddle para demostrar cuál es el problema que tiene. ¿Es su pregunta realmente justa, cómo acceder a los datos dentro de una matriz o un objeto javascript? Y seamos claros acerca de los datos, JSON o el objeto Javascript: stackoverflow.com/questions/8294088/javascript-object-vs-json
Xotic750
2
suponga que "columnName" es "firstName" y "column.value" es el valor (por ejemplo: "John"). Solo necesito saber cómo empujarlos dinámicamente entre paréntesis ('{}')
ohadinho
1
¿Qué sucede cuando ejecutas el código que has mostrado?
nnnnnn
@ohadinho no está claro cuál es su estructura de datos de entrada (json)columnsResult
Kamil Kiełczewski

Respuestas:

154

¡Esto es lo que necesitas!

function onGeneratedRow(columnsResult)
{
    var jsonData = {};
    columnsResult.forEach(function(column) 
    {
        var columnName = column.metadata.colName;
        jsonData[columnName] = column.value;
    });
    viewData.employees.push(jsonData);
 }
Waqar Alamgir
fuente
¿Cómo sabía que el OP no necesita contar las filas con'rowNum '?
Xotic750
1
push no necesita número de fila
Waqar Alamgir
porque json generation no necesita contar, siempre puedes usar .length para obtener filas.
Waqar Alamgir
55
Nunca dije que la generación JSON sí. Era más el caso que usted decía "¡Esto es lo que necesita!", Pero quería saber cómo sabía que el OP no necesitaba ese conteo, ¿o simplemente asumió? Su respuesta no genera JSON por cierto.
Xotic750
1
@WaqarAlamgir: eso es exactamente lo que necesitaba en este momento. ¡Salud!
bob.mazzo
96

Quizás esta información te ayude.

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
fuente
10

Este tema, especialmente la respuesta de Xotic750, fue muy útil para mí. Quería generar una variable json para pasarla a un script php usando ajax. Mis valores se almacenaron en dos matrices, y los quería en formato json. Este es un ejemplo genérico:

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

El resultado en el registro de la consola debería ser algo como esto:

{
   "objArray1": {
        "obj1": 121,
        "obj2": 324,
        "obj3": 42,
        "obj4": 31
   },
   "objArray2": {
        "obj1": 232,
        "obj2": 131,
        "obj3": 443
  }
}
el efecto mariposa
fuente
2
¿Puedo destacar la utilidad de espaciar correctamente el código que envíe aquí? Es mucho más difícil de leer sin espacios.
Kevin Lewis
1
Esto me ayudó sin fin. Exactamente lo que necesitaba.
Derek
-1

JavaScript

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

Resultado (JSON)

{
   "id": "c001",
   "name": "Hello Test"
}
Ishan Lakshitha
fuente