(สิ่งนี้ถูกเพิ่มไปยังห้องสมุดของฉันที่GitHub )
คิดค้นล้อใหม่ที่นี่! การแก้ปัญหาเหล่านี้ไม่ได้ผลกับสถานการณ์ของฉัน ดังนั้นฉันจึงรีบตอบคำสั่งของwilsonpageอย่างรวดเร็ว อันนี้ไม่ได้สำหรับการพิมพ์ไปที่หน้าจอ (ผ่านทางคอนโซลหรือฟิลด์ข้อความหรืออะไรก็ตาม) มันจะปรับการทำงานในสถานการณ์เหล่านั้นและทำงานได้ดีเป็น OP alert
ที่ร้องขอสำหรับ คำตอบมากมายที่นี่ไม่ได้ใช้alert
ตามที่ร้องขอ อย่างไรก็ตามมันเป็นรูปแบบสำหรับการขนส่งข้อมูล toSource()
รุ่นนี้ดูเหมือนว่าจะกลับมาเป็นผลที่คล้ายกันเป็นอย่างมาก ฉันไม่ได้ทดสอบJSON.stringify
แต่ฉันคิดว่านี่เป็นเรื่องเดียวกัน รุ่นนี้เหมือนโพลีฟิลเพื่อให้คุณสามารถใช้งานได้ในทุกสภาพแวดล้อม ผลลัพธ์ของฟังก์ชั่นนี้คือการประกาศวัตถุจาวาสคริปต์ที่ถูกต้อง
ฉันไม่สงสัยเลยว่าบางอย่างเช่นนี้มีอยู่แล้วในบางแห่ง แต่มันสั้นกว่าที่จะทำมากกว่าการใช้เวลาสักครู่เพื่อค้นหาคำตอบที่ผ่านมา และเนื่องจากคำถามนี้เป็นที่นิยมที่สุดของฉันใน google เมื่อฉันเริ่มค้นหาเกี่ยวกับเรื่องนี้; ฉันคิดว่าการวางไว้ที่นี่อาจช่วยผู้อื่นได้
อย่างไรก็ตามผลลัพธ์จากฟังก์ชั่นนี้จะเป็นตัวแทนสตริงของวัตถุของคุณแม้ว่าวัตถุของคุณจะมีวัตถุและอาร์เรย์ฝังตัวอยู่และแม้ว่าวัตถุหรืออาร์เรย์เหล่านั้นจะมีวัตถุและอาร์เรย์ฝังตัวอยู่ก็ตาม (ฉันได้ยินว่าคุณชอบดื่มหรือเปล่าดังนั้นฉันก็เลยเก็บรถของคุณด้วยเครื่องทำความเย็นแล้วฉันก็นำเครื่องทำความเย็นของคุณไปเก็บความเย็นของคุณด้วยดังนั้นเครื่องทำความเย็นของคุณสามารถดื่มได้ในขณะที่คุณกำลังเย็นสบาย)
อาร์เรย์จะถูกเก็บไว้ด้วย[]
แทน{}
ดังนั้นจึงไม่มีคู่คีย์ / ค่าเพียงค่า เหมือนอาร์เรย์ปกติ ดังนั้นพวกมันจึงถูกสร้างขึ้นเหมือนอาร์เรย์
นอกจากนี้สตริงทั้งหมด (รวมถึงชื่อคีย์) ถูกอ้างถึงสิ่งนี้ไม่จำเป็นยกเว้นว่าสตริงเหล่านั้นมีอักขระพิเศษ (เช่นช่องว่างหรือเครื่องหมายทับ) แต่ฉันไม่รู้สึกอยากตรวจจับสิ่งนี้เพียงเพื่อลบเครื่องหมายคำพูดบางอย่างที่จะยังใช้ได้ดีอยู่
สตริงที่เป็นผลลัพธ์นี้สามารถใช้กับeval
หรือเพียงแค่ทิ้งลงในการจัดการสตริง var thru ดังนั้นการสร้างวัตถุของคุณใหม่อีกครั้งจากข้อความ
function ObjToSource(o){
if (!o) return 'null';
var k="",na=typeof(o.length)=="undefined"?1:0,str="";
for(var p in o){
if (na) k = "'"+p+ "':";
if (typeof o[p] == "string") str += k + "'" + o[p]+"',";
else if (typeof o[p] == "object") str += k + ObjToSource(o[p])+",";
else str += k + o[p] + ",";
}
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
แจ้งให้เราทราบหากฉันทำมันยุ่งทั้งหมดทำงานได้ดีในการทดสอบของฉัน นอกจากนี้วิธีเดียวที่ฉันจะคิดในการตรวจสอบประเภทคือการตรวจสอบการปรากฏตัวของarray
length
เนื่องจาก Javascript จัดเก็บอาร์เรย์เป็นวัตถุจริงๆฉันจึงไม่สามารถตรวจสอบประเภทarray
(ไม่มีประเภทดังกล่าว!) หากใครอื่นรู้วิธีที่ดีกว่าฉันชอบที่จะได้ยินมัน เพราะถ้าวัตถุของคุณมีคุณสมบัติชื่อlength
แล้วฟังก์ชั่นนี้จะถือว่ามันผิดพลาดเป็นอาร์เรย์
แก้ไข: เพิ่มการตรวจสอบวัตถุที่มีค่าว่าง ขอบคุณ Brock Adams
แก้ไข: ด้านล่างเป็นฟังก์ชั่นคงที่เพื่อให้สามารถพิมพ์วัตถุซ้ำซ้ำอย่างไม่มีที่สิ้นสุด สิ่งนี้ไม่ได้พิมพ์เหมือนกับtoSource
FF เนื่องจากtoSource
จะพิมพ์การเรียกซ้ำแบบไม่มีที่สิ้นสุดหนึ่งครั้งโดยที่ฟังก์ชันนี้จะฆ่ามันทันที ฟังก์ชั่นนี้ทำงานช้ากว่าฟังก์ชั่นด้านบนดังนั้นฉันจึงเพิ่มที่นี่แทนการแก้ไขฟังก์ชั่นด้านบนเนื่องจากจำเป็นเฉพาะในกรณีที่คุณวางแผนที่จะส่งวัตถุที่ลิงก์กลับไปยังตัวเองที่อื่น
const ObjToSource=(o)=> {
if (!o) return null;
let str="",na=0,k,p;
if (typeof(o) == "object") {
if (!ObjToSource.check) ObjToSource.check = new Array();
for (k=ObjToSource.check.length;na<k;na++) if (ObjToSource.check[na]==o) return '{}';
ObjToSource.check.push(o);
}
k="",na=typeof(o.length)=="undefined"?1:0;
for(p in o){
if (na) k = "'"+p+"':";
if (typeof o[p] == "string") str += k+"'"+o[p]+"',";
else if (typeof o[p] == "object") str += k+ObjToSource(o[p])+",";
else str += k+o[p]+",";
}
if (typeof(o) == "object") ObjToSource.check.pop();
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
ทดสอบ:
var test1 = new Object();
test1.foo = 1;
test1.bar = 2;
var testobject = new Object();
testobject.run = 1;
testobject.fast = null;
testobject.loop = testobject;
testobject.dup = test1;
console.log(ObjToSource(testobject));
console.log(testobject.toSource());
ผลลัพธ์:
{'run':1,'fast':null,'loop':{},'dup':{'foo':1,'bar':2}}
({run:1, fast:null, loop:{run:1, fast:null, loop:{}, dup:{foo:1, bar:2}}, dup:{foo:1, bar:2}})
หมายเหตุ: การพยายามพิมพ์document.body
เป็นตัวอย่างที่น่ากลัว สำหรับหนึ่ง FF toSource
เพียงแค่พิมพ์สตริงวัตถุที่ว่างเปล่าเมื่อใช้ และเมื่อใช้ฟังก์ชั่นด้านบนจะเกิดปัญหา FF SecurityError: The operation is insecure.
ขึ้น และ Chrome Uncaught RangeError: Maximum call stack size exceeded
จะผิดพลาดใน เห็นได้ชัดdocument.body
ว่าไม่ได้ตั้งใจจะแปลงเป็นสตริง เนื่องจากมีขนาดใหญ่เกินไปหรือขัดต่อนโยบายความปลอดภัยเพื่อเข้าถึงคุณสมบัติบางอย่าง ถ้าฉันทำบางสิ่งบางอย่างที่นี่อย่าบอก!