จะสร้าง json โดย JavaScript สำหรับ loop ได้อย่างไร?


99

ฉันมีอาร์เรย์ของแท็กเลือก

<select id='uniqueID' name="status">
      <option value="1">Present</option>
      <option value="2">Absent</option>
 </select>

และฉันต้องการสร้างวัตถุ json ที่มีสองฟิลด์ 'uniqueIDofSelect และ optionValue' ใน JavaScript

ฉันใช้ getElementsByName ("สถานะ") และทำซ้ำ

แก้ไข

ฉันต้องการออกไปเช่น

[{"selectID":2,"OptionValue":"2"},
{"selectID":4,"optionvalue":"1"}]

และอื่น ๆ ...


ฉันคิดว่า optionValue ควรเป็นแอตทริบิวต์ "value" ของแต่ละองค์ประกอบ "option": 1, 2 เป็นต้น แต่ ID คืออะไร? มันเป็นข้อความ? "ปัจจุบัน" "ขาด" ฯลฯ ?
ระบบหยุด

โอเคถ้า ID เป็น uniqueID ของ select ก็จะมี optionValue ได้แค่ตัวเดียวใช่ไหม ฉันคิดว่าคุณต้องการการเลือกปัจจุบันไม่ใช่อาร์เรย์ของการเลือกทั้งหมด?
ระบบหยุด

คำตอบ:


174

จากสิ่งที่ฉันเข้าใจในคำขอของคุณสิ่งนี้ควรได้ผล:

<script>
//  var status  = document.getElementsByID("uniqueID"); // this works too
var status  = document.getElementsByName("status")[0];
var jsonArr = [];

for (var i = 0; i < status.options.length; i++) {
    jsonArr.push({
        id: status.options[i].text,
        optionValue: status.options[i].value
    });
}
</script>

41
JSON เป็นวัตถุไม่ใช่อาร์เรย์
Gumbo

สร้างอาร์เรย์วัตถุ json แต่ฉันต้องการวัตถุ json เพียงชิ้นเดียว
Vikas

1
คุณไม่จำเป็นต้องประกาศอาร์เรย์เช่น var jsonObj = new Array (); เพราะตัวอย่างของคุณไม่ได้ผลสำหรับฉัน เมื่อฉันเปลี่ยนเป็น Array ใหม่ () มันก็ใช้งานได้
Meow

18
var jsonArr = [];สร้าง Array ใหม่ var jsonObj = {};สร้างวัตถุใหม่
b_dubb

คำถามโง่ ๆ ฉันรู้ความแตกต่างระหว่างอาร์เรย์ของวัตถุและวัตถุที่มีอาร์เรย์ของวัตถุ (ความแตกต่างระหว่างjsonArr = []และjsonObj = {}ในโพสต์นี้) ฉันมีบ่อยเกินไปและอาจผิดพลาดด้วยซ้ำที่อ้างถึงออบเจ็กต์ที่มีอาร์เรย์ของออบเจ็กต์ที่แต่ละคู่มีชื่อ / ค่า (อาจแตกต่างกัน) เป็น "ออบเจ็กต์ JSON" เมื่อคุ้นเคยกับไวยากรณ์ JSON อย่างง่าย (เช่นเดียวกับที่คุณมีใน.jsonไฟล์จริง) ฉันรู้ว่าในทางไวยากรณ์นี้แตกต่างกัน คุณจะอ้างถึงอาร์เรย์ของวัตถุเป็น JSON ด้วยหรือไม่?
VoidKing


8

หากคุณต้องการวัตถุ JavaScript เดียวดังต่อไปนี้:

{ uniqueIDofSelect: "uniqueID", optionValue: "2" }

(โดยที่ตัวเลือก 2 "ไม่มี" คือการเลือกปัจจุบัน) จากนั้นควรสร้างรหัสต่อไปนี้:

  var jsObj = null;
  var status = document.getElementsByName("status")[0];
  for (i = 0, i < status.options.length, ++i) {
     if (options[i].selected ) {
        jsObj = { uniqueIDofSelect: status.id, optionValue: options[i].value };
        break;
     }
  }

หากคุณต้องการอาร์เรย์ของวัตถุดังกล่าวทั้งหมด (ไม่เพียงหนึ่งที่เลือก) ใช้รหัสของไมเคิลแต่สลับออกสำหรับstatus.options[i].textstatus.id

หากคุณต้องการสตริงที่มีการแทนค่า JSON ของอ็อบเจ็กต์ที่เลือกให้ใช้สิ่งนี้แทน:

  var jsonStr = "";
  var status = document.getElementsByName("status")[0];
  for (i = 0, i < status.options.length, ++i) {
     if (options[i].selected ) {
        jsonStr = '{ '
                  + '"uniqueIDofSelect" : '
                  + '"' + status.id + '"'
                  + ", "
                  + '"optionValue" : '
                  + '"'+ options[i].value + '"'
                  + ' }';
        break;
     }
  }

3

ถ้าฉันต้องการสร้าง JavaScript Object จากสตริงที่สร้างโดย for loop ฉันจะใช้วิธี JSON to Object ฉันจะสร้างสตริง JSON โดยการวนซ้ำสำหรับการวนซ้ำจากนั้นใช้ JavaScript Framework ยอดนิยมเพื่อประเมิน JSON เป็น Object

ฉันได้ใช้ต้นแบบ JavaScript กรอบ ฉันมีอาร์เรย์สองชุดพร้อมคีย์และค่า ฉันวนซ้ำเพื่อวนซ้ำและสร้างสตริง JSON ที่ถูกต้อง ฉันใช้ฟังก์ชัน evalJSON ()เพื่อแปลงสตริง JSON เป็นวัตถุ JavaScript

นี่คือตัวอย่างโค้ด ลองใช้คอนโซล FireBugของคุณ

var key = ["color", "size", "fabric"];
var value = ["Black", "XL", "Cotton"];

var json = "{ ";
for(var i = 0; i < key.length; i++) {
    (i + 1) == key.length ? json += "\"" + key[i] + "\" : \"" + value[i] + "\"" : json += "\"" + key[i] + "\" : \"" + value[i] + "\",";
}
json += " }";
var obj = json.evalJSON(true);
console.log(obj);

1
ขอบคุณที่ช่วยฉันได้มากฉันใช้ PARSE.json (jsonstring) แทน jsonstring.evalJSON (จริง);
Arnaud Bouchot

0

คำถามของคุณค่อนข้างยากที่จะถอดรหัส แต่ฉันจะลองแทงดู

คุณพูด:

ฉันต้องการสร้างวัตถุ json ที่มีสองฟิลด์ uniqueIDofSelectและoptionValueในจาวาสคริปต์

แล้วคุณพูดว่า:

ฉันต้องการผลลัพธ์เช่น

[{"selectID":2,"optionValue":"2"},
{"selectID":4,"optionvalue":"1"}]

เอาท์พุทตัวอย่างนี้ไม่มีชื่อฟิลด์uniqueIDofSelectแต่มีเพียงoptionValue.

อย่างไรก็ตามคุณกำลังขออาร์เรย์ของวัตถุ ...

จากนั้นในความคิดเห็นของ michaels ตอบคุณพูดว่า:

สร้างอาร์เรย์วัตถุ json แต่ฉันต้องการวัตถุ json เพียงชิ้นเดียว

คุณไม่ต้องการอาร์เรย์ของวัตถุเหรอ?

แล้วคุณต้องการอะไร?

โปรดตัดสินใจของคุณ


สิ่งแรก: ขออภัยที่ uniqueIDofSelect == selectID (Id ขององค์ประกอบที่เลือกฉันสามารถเก็บ id ของบันทึกเป็นรหัสองค์ประกอบที่เลือกได้ (สำหรับการอัปเดตบันทึกต่อวัตถุประสงค์) ฉันจะมีจำนวนขององค์ประกอบที่เลือกที่สร้างโดย foreach loop อันที่จริงแล้วลูปนี้คือ ซึ่งเราใช้ใน asp.net MVC เพื่อแสดงอ็อบเจ็กต์ Enumerable 2) คุณพูดถูกความผิดพลาดของฉันที่ฉันสนุกที่เอาต์พุตทั้งหมดเป็นวัตถุ json หนึ่งชิ้น แต่เป็นอาร์เรย์ของวัตถุที่แท้จริง ดังนั้นคำตอบของไมเคิลจึงสมบูรณ์แบบ ขอขอบคุณที่ชี้ให้เห็น
Vikas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.