Créer un objet JSON dynamiquement via JavaScript (sans chaînes concates)

130

J'ai ces données JSON:

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

Supposons que je ne sache pas combien de colonnes et de lignes d'employés j'ai, comment créer cet objet en JavaScript (sans chaînes concates)? Supposons que j'obtienne chaque ligne dans la méthode "onGeneratedRow" et que je doive pousser chaque colonne (firstName, lastName) vers les crochets '{}'.

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
la source
1
C'est quoi columnsResult? C'est quoi metadata?
georg
1
Cette question n'a pas de sens pour moi pour le moment, pouvez-vous expliquer davantage, d'où viennent vos données et dans quel format. Ajoutez-vous simplement des données existantes ou créez-vous tout cela à partir de zéro. Peut-être que vous pouvez créer un jsfiddle pour montrer quel est le problème que vous rencontrez. Votre question est-elle vraiment juste, comment accéder aux données dans un tableau / ou un objet javascript? Et soyons clairs sur les données, JSON ou objet Javascript: stackoverflow.com/questions/8294088/javascript-object-vs-json
Xotic750
2
Supposons que "columnName" est "firstName" et "column.value" est la valeur (par exemple: "John"). J'ai juste besoin de savoir comment les pousser dynamiquement entre crochets ('{}')
ohadinho
1
Que se passe-t-il lorsque vous exécutez le code que vous avez montré?
nnnnnn
@ohadinho on ne sait pas quelle est votre structure de données d'entrée (json)columnsResult
Kamil Kiełczewski

Réponses:

154

C'est ce dont vous avez besoin!

function onGeneratedRow(columnsResult)
{
    var jsonData = {};
    columnsResult.forEach(function(column) 
    {
        var columnName = column.metadata.colName;
        jsonData[columnName] = column.value;
    });
    viewData.employees.push(jsonData);
 }
Waqar Alamgir
la source
Comment saviez-vous que l'OP n'a pas besoin de compter les lignes avec «rowNum »?
Xotic750
1
push n'a pas besoin de numéro de ligne
Waqar Alamgir
parce que la génération json n'a pas besoin de compter, vous pouvez toujours utiliser .length pour obtenir des lignes.
Waqar Alamgir
5
Je n'ai jamais dit que la génération JSON le faisait. C'était plutôt le cas que vous disiez "C'est ce dont vous avez besoin!", Mais je voulais savoir comment vous saviez que le décompte n'était pas nécessaire au PO, ou avez-vous simplement supposé? Votre réponse ne génère pas de JSON btw.
Xotic750
1
@WaqarAlamgir - c'est exactement ce dont j'avais besoin en ce moment. À votre santé!
bob.mazzo
96

Peut-être que ces informations vous aideront.

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
la source
10

Ce sujet, en particulier la réponse de Xotic750 m'a été très utile. Je voulais générer une variable json pour la passer à un script php en utilisant ajax. Mes valeurs ont été stockées dans deux tableaux, et je les voulais au format json. Ceci est un exemple générique:

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

Le résultat dans le journal de la console devrait ressembler à ceci:

{
   "objArray1": {
        "obj1": 121,
        "obj2": 324,
        "obj3": 42,
        "obj4": 31
   },
   "objArray2": {
        "obj1": 232,
        "obj2": 131,
        "obj3": 443
  }
}
l'effet papillon
la source
2
Puis-je souligner l'utilité de bien espacer le code que vous soumettez ici? C'est beaucoup plus difficile à lire sans espacement.
Kevin Lewis
1
Cela m'a aidé sans fin. Exactement ce dont j'avais besoin.
Derek le
-1

JavaScript

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

Résultat (JSON)

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