สร้างออบเจ็กต์ JSON แบบไดนามิกผ่าน JavaScript (โดยไม่ต้องต่อสตริง)


130

ฉันมีข้อมูล JSON นี้:

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

สมมติว่าฉันไม่ทราบจำนวนคอลัมน์และแถวของพนักงานฉันจะสร้างออบเจ็กต์นี้ใน JavaScript ได้อย่างไร (โดยไม่ต้องต่อสตริง) สมมติว่าฉันได้รับแต่ละแถวในเมธอด "onGeneratedRow" และฉันต้องดันแต่ละคอลัมน์ (firstName, lastName) ไปที่วงเล็บ "{}"

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
คืออะไรcolumnsResult? คืออะไรmetadata?
georg

1
คำถามนี้ไม่สมเหตุสมผลสำหรับฉันในปัจจุบันคุณช่วยอธิบายเพิ่มเติมได้ไหมว่าข้อมูลของคุณมาจากไหนและอยู่ในรูปแบบใด คุณแค่เพิ่มข้อมูลที่มีอยู่หรือสร้างทั้งหมดตั้งแต่ต้น บางทีคุณอาจสร้าง jsfiddle เพื่อแสดงให้เห็นว่าปัญหาที่คุณพบคืออะไรคำถามของคุณเป็นเพียงวิธีการเข้าถึงข้อมูลภายในวัตถุอาร์เรย์ / หรือจาวาสคริปต์หรือไม่? และให้ชัดเจนเกี่ยวกับข้อมูล JSON หรือวัตถุ Javascript: stackoverflow.com/questions/8294088/javascript-object-vs-json
Xotic750

2
สมมติว่า "columnName" คือ "firstName" และ "column.value" คือค่า (ตัวอย่างเช่น "John") ฉันแค่ต้องรู้วิธีดันพวกเขาแบบไดนามิกลงในวงเล็บ ('{}')
ohadinho

1
จะเกิดอะไรขึ้นเมื่อคุณเรียกใช้รหัสที่คุณแสดง
nnnnnn

@ohadinho ไม่ชัดเจนโครงสร้างข้อมูลอินพุตของคุณคืออะไร (json)columnsResult
Kamil Kiełczewski

คำตอบ:


154

นี่คือสิ่งที่คุณต้องการ!

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

คุณรู้ได้อย่างไรว่า OP ไม่จำเป็นต้องนับแถวด้วย´rowNum´
Xotic750

1
push ไม่จำเป็นต้องมีหมายเลขแถว
Waqar Alamgir

เนื่องจากการสร้าง json ไม่จำเป็นต้องมีการนับคุณจึงสามารถใช้. length เพื่อรับแถวได้มากขึ้น
Waqar Alamgir

5
ฉันไม่เคยบอกว่าการสร้าง JSON ทำ เป็นกรณีที่คุณระบุว่า "นี่คือสิ่งที่คุณต้องการ!" แต่ฉันอยากรู้ว่าคุณรู้ได้อย่างไรว่า OP ไม่ต้องการการนับหรือคุณแค่คิด? คำตอบของคุณไม่สร้าง JSON btw
Xotic750

1
@WaqarAlamgir - นั่นคือสิ่งที่ฉันต้องการในขณะนี้ ไชโย!
bob.mazzo

96

บางทีข้อมูลนี้อาจช่วยคุณได้

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

หัวข้อนี้โดยเฉพาะคำตอบของ Xotic750 มีประโยชน์กับฉันมาก ฉันต้องการสร้างตัวแปร json เพื่อส่งต่อไปยังสคริปต์ php โดยใช้ ajax ค่าของฉันถูกเก็บไว้ในสองอาร์เรย์และฉันต้องการให้อยู่ในรูปแบบ json นี่คือตัวอย่างทั่วไป:

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

ผลลัพธ์ในคอนโซล Log ควรเป็นดังนี้:

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

2
ฉันสามารถเน้นถึงประโยชน์ในการเว้นวรรครหัสที่คุณส่งมาที่นี่ได้อย่างเหมาะสมหรือไม่ การอ่านโดยไม่เว้นวรรคนั้นยากกว่ามาก
Kevin Lewis

1
สิ่งนี้ช่วยฉันได้ไม่สิ้นสุด สิ่งที่ฉันต้องการ
Derek

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.