การแปลงวัตถุเป็นสตริง


975

ฉันจะแปลงวัตถุ JavaScript เป็นสตริงได้อย่างไร

ตัวอย่าง:

var o = {a:1, b:2}
console.log(o)
console.log('Item: ' + o)

เอาท์พุท:

วัตถุ {a = 1, b = 2} // ผลลัพธ์ที่อ่านได้ดีมาก :)
รายการ: [วัตถุวัตถุ] // ไม่ทราบว่ามีอะไรอยู่ภายใน :(


7
แปลงเป็นสตริงเพื่อวัตถุประสงค์อะไร? คุณหมายถึงเป็นอันดับเพื่อให้คุณสามารถสร้างวัตถุในภายหลังจากสตริงหรือไม่ หรือเพียงเพื่อแสดง?
Shadow Wizard คือหูสำหรับคุณ

19
ผู้เขียนหายไปจากปี แต่อ่านในใจหลังจากปีฉันเดาจุดเริ่มต้นของปัญหาคือ console.log (obj) ซึ่งแสดงวัตถุที่มีคุณสมบัติในขณะที่ console.log ('obj:' + obj ) ทำงานอย่างอื่นอย่างสับสน
Danubian Sailor

2
ไม่สามารถใช้เพิ่มสองวัตถุได้หากเราสามารถทำได้จะไม่มีความแตกต่างในประเภทของค่าและประเภทอ้างอิง
Nishant Kumar

12
var o = {a: 1, b: 2}; console.log ('รายการ:' + JSON.stringify (o))
Nishant Kumar

22
console.log("Item", obj);ถ้ามันสำหรับคอนโซลผมจะแนะนำให้ทำ ไม่จำเป็นต้องมีอะไรซับซ้อน
soktinpk

คำตอบ:


1333

ฉันอยากจะแนะนำให้ใช้JSON.stringifyซึ่งแปลงชุดของตัวแปรในวัตถุเป็นสตริง JSON เบราว์เซอร์ที่ทันสมัยส่วนใหญ่รองรับวิธีนี้โดยกำเนิด แต่สำหรับเบราว์เซอร์ที่ไม่มีคุณสามารถรวมรุ่น JS :

var obj = {
  name: 'myObj'
};

JSON.stringify(obj);

7
สำหรับการอ้างอิง IE6 และ 7 ไม่รองรับสิ่งนี้ IE6 นั้นไม่ใช่เรื่องใหญ่เพราะมีผู้ใช้น้อยมากและมีแคมเปญที่ใช้งานอยู่เพื่อฆ่ามัน ... แต่ก็ยังมีผู้ใช้ IE7 อยู่เล็กน้อย (ขึ้นอยู่กับฐานผู้ใช้ของคุณ)
MikeMurko

30
ฉันได้รับ "Uncaught TypeError: การแปลงโครงสร้างแบบวงกลมเป็น JSON" แม้ว่าจะมีการอ้างอิงแบบวงกลมฉันก็ยังอยากเห็นการแสดงสตริงของวัตถุของฉัน ฉันจะทำอย่างไร
Pascal Klein

26
foo: function () {...}นี้จะไม่ทำงานถ้าวัตถุมีคุณสมบัติฟังก์ชั่นเช่น:

2
ลิงก์ไปยังไลบรารี JSON ไม่ทำงานหากคลิกจาก StackOverflow คัดลอกและวางในแถบที่อยู่
f.ardelian

1
คุณสามารถใช้JSON.stringify(obj, null, 2);สำหรับเอาต์พุตที่สวยกว่าได้
l.poellabauer

126

ใช้ฟังก์ชันสตริง JavaScript ()

 String(yourobject); //returns [object Object]

หรือทำให้เป็นสตริง ()

JSON.stringify(yourobject)

28
var foo = {bar: 1}; สตริง (foo); -> "[วัตถุวัตถุ]"
Anti Veeranna

1
var foo = {bar: 1}; สตริง (foo [ 'บาร์']); -> "1"
Vikram Pote

3
ถ้าคุณต้องการวัตถุทั้งหมดเป็นสตริงใช้ JSON.stringify (foo)
Vikram Pote

8
JSON.stringify(yourobject)แม่บ้านวันของฉัน!
สารสื่อประสาท

1
@TranslucentCloud * made
Parampal Pooni

87

แน่นอนว่าการแปลงวัตถุให้เป็นสตริงคุณต้องใช้วิธีการของคุณเองเช่น:

function objToString (obj) {
    var str = '';
    for (var p in obj) {
        if (obj.hasOwnProperty(p)) {
            str += p + '::' + obj[p] + '\n';
        }
    }
    return str;
}

ที่จริงข้างต้นเพียงแสดงวิธีการทั่วไป คุณอาจต้องการใช้บางอย่างเช่นhttp://phpjs.org/functions/var_export,578หรือhttp://phpjs.org/functions/var_dump:604

หรือหากคุณไม่ได้ใช้วิธีการ (ฟังก์ชั่นเป็นคุณสมบัติของวัตถุของคุณ) คุณอาจจะสามารถใช้มาตรฐานใหม่ (แต่ไม่ได้ใช้ในเบราว์เซอร์รุ่นเก่า แต่คุณสามารถหายูทิลิตี้เพื่อช่วยพวกเขาได้) JSON .stringify () แต่จะไม่ทำงานหากวัตถุนั้นใช้ฟังก์ชั่นหรือคุณสมบัติอื่น ๆ


78

ทำให้มันง่ายกับคุณก็สามารถใช้เครื่องหมายจุลภาคแทนconsole จะพยายามที่จะแปลงวัตถุเป็นสตริงขณะจุลภาคจะแสดงแยกต่างหากในคอนโซล++

ตัวอย่าง:

var o = {a:1, b:2};
console.log(o);
console.log('Item: ' + o);
console.log('Item: ', o);   // :)

เอาท์พุท:

Object { a=1, b=2}           // useful
Item: [object Object]        // not useful
Item:  Object {a: 1, b: 2}   // Best of both worlds! :)

การอ้างอิง: https://developer.mozilla.org/en-US/docs/Web/API/Console.log


ทางออกที่ดี! แต่ยูสามารถบอกฉันสิ่งที่เกิดขึ้นอยู่เบื้องหลังเมื่อคุณทำเช่นนี้: console.log(o)? เนื่องจากถ้าคุณพยายามที่จะบันทึกวัตถุที่เพิ่มเข้าไปในสตริงมันจะเรียกtoString()วัตถุนั้นจริงๆ
Gocy015

1
console.logในที่สุดเรียกสิ่งที่เรียกว่าPrinterข้อมูลจำเพาะหมายเหตุ: "วิธีการใช้งานพิมพ์จะขึ้นอยู่กับการใช้งาน" - หมายความว่าทุกเบราว์เซอร์สามารถทำสิ่งนี้แตกต่างกัน (ดูconsole.spec.whatwg.org/#printer ) Firefox จะแสดงวัตถุเป็นสตริง แต่มีสีดี Chrome จะแสดงวัตถุเป็นกลุ่มการโต้ตอบที่คุณสามารถขยายเพื่อดูคุณสมบัติได้ ให้มันลอง!
ลุค

2
เคล็ดลับดีมากและอาจดีสำหรับเว็บเบราว์เซอร์ที่ทันสมัย ​​แต่ไม่น่าเชื่อถือ 100% สำหรับการใช้งาน JS เช่นใน Qt QML ซึ่งใช้เอ็นจิ้น JS ผลลัพธ์console.log('Item: ', o);ยังคงItem: [object Object]อยู่
Paul Masri-Stone

แทนการconsole.logที่คุณสามารถใช้console.dir(o)ในการพิมพ์วัตถุจาวาสคริปต์แทนเพื่อ printig มันเป็นสตริง ในเครื่องมือสำหรับนักพัฒนาสิ่งนี้จะช่วยให้สามารถเปิดวัตถุและตรวจสอบคุณสมบัติทั้งหมดแม้กระทั่งอาร์เรย์ (ดู: developer.mozilla.org/de/docs/Web/API/Console/dir )
EagleT

37

แก้ไข อย่าใช้คำตอบนี้เนื่องจากไม่ได้ทำงานใน Internet Explorer ใช้วิธีแก้ปัญหาGary Chambers

toSource ()เป็นฟังก์ชันที่คุณกำลังค้นหาซึ่งจะเขียนเป็น JSON

var object = {};
object.first = "test";
object.second = "test2";
alert(object.toSource());

6
แม้ว่ามันจะสะดวกในการดีบั๊กใน Firefox toSource()ไม่สามารถใช้งานได้ใน IE
Brett Zamir

4
toSource() ไม่ใช่มาตรฐานที่รู้จักดังนั้นจึงไม่สามารถรับประกันได้ว่าจะได้รับการสนับสนุนในเบราว์เซอร์ทั้งหมด
Gary Chambers

11
อ่าขอบคุณที่ชี้ไป ฉันจะทิ้งคำตอบไว้ที่นี่เพื่อคนอื่นที่ไม่ทราบ
Gazler

ฉันหวังว่าฉันจะสามารถโหวตคุณได้มากขึ้นเพราะนี่เป็นทางออกที่ยอดเยี่ยมสำหรับสภาพแวดล้อมที่มีจาวาสคริปต์ (แต่บันทึกของคอนโซลไม่สะดวก / ไม่สามารถเข้าถึงได้)
Zack Morris

คุณสามารถระบุ polypill ให้กับ toSource: github.com/oliver-moran/toSource.js/blob/master/toSource.js
roland

32

ทางเลือกหนึ่ง :

console.log('Item: ' + JSON.stringify(o));

o ถูกพิมพ์เป็นสตริง

ตัวเลือกอื่น (ดังที่soktinpkชี้ให้เห็นในความคิดเห็น) และดีกว่าสำหรับการดีบักคอนโซล IMO:

console.log('Item: ', o);

o ถูกพิมพ์เป็นวัตถุซึ่งคุณสามารถเจาะลึกลงไปถ้าคุณมีเขตข้อมูลเพิ่มเติม


22

ไม่มีวิธีแก้ปัญหาสำหรับฉันที่นี่ JSON.stringify ดูเหมือนจะเป็นสิ่งที่ผู้คนจำนวนมากพูด แต่มันตัดฟังก์ชั่นออกมาและดูเหมือนจะค่อนข้างเสียหายสำหรับวัตถุและอาร์เรย์บางตัวที่ฉันพยายามทดสอบ

ฉันสร้างโซลูชันของตัวเองซึ่งใช้งานได้ใน Chrome เป็นอย่างน้อย โพสต์ไว้ที่นี่เพื่อให้ทุกคนที่ค้นหาบน Google สามารถพบได้

//Make an object a string that evaluates to an equivalent object
//  Note that eval() seems tricky and sometimes you have to do
//  something like eval("a = " + yourString), then use the value
//  of a.
//
//  Also this leaves extra commas after everything, but JavaScript
//  ignores them.
function convertToText(obj) {
    //create an array that will later be joined into a string.
    var string = [];

    //is object
    //    Both arrays and objects seem to return "object"
    //    when typeof(obj) is applied to them. So instead
    //    I am checking to see if they have the property
    //    join, which normal objects don't have but
    //    arrays do.
    if (typeof(obj) == "object" && (obj.join == undefined)) {
        string.push("{");
        for (prop in obj) {
            string.push(prop, ": ", convertToText(obj[prop]), ",");
        };
        string.push("}");

    //is array
    } else if (typeof(obj) == "object" && !(obj.join == undefined)) {
        string.push("[")
        for(prop in obj) {
            string.push(convertToText(obj[prop]), ",");
        }
        string.push("]")

    //is function
    } else if (typeof(obj) == "function") {
        string.push(obj.toString())

    //all other values can be done with JSON.stringify
    } else {
        string.push(JSON.stringify(obj))
    }

    return string.join("")
}

แก้ไข: ฉันรู้ว่ารหัสนี้สามารถปรับปรุงได้ แต่ก็ไม่เคยทำมันเลย ผู้ใช้ andrey แนะนำการปรับปรุงที่นี่พร้อมกับความคิดเห็น:

นี่คือรหัสที่มีการเปลี่ยนแปลงเล็กน้อยซึ่งสามารถจัดการ 'null' และ 'undefined' และยังไม่เพิ่มจุลภาคมากเกินไป

ใช้ความเสี่ยงของคุณเองโดยที่ฉันยังไม่ได้ทำการยืนยันเลย อย่าลังเลที่จะแนะนำการปรับปรุงเพิ่มเติมเป็นความคิดเห็น


คุณกำลังพลาด '}' s
dacopenhagen

2
รหัสที่ดีมาก แต่มีการต่อท้าย,ที่จุดสิ้นสุดของแต่ละวัตถุ / อาร์เรย์
NiCk Newman

นี่คือคำตอบที่ดีที่สุด
Roman

20

console.log('string:', obj)หากคุณเพียงแค่การแสดงผลไปยังคอนโซลคุณสามารถใช้ สังเกตเครื่องหมายจุลภาค


สิ่งนี้ก่อให้เกิดปัญหาในสถานการณ์ที่ AJAX และรอการเล่นมา - console.logมักจะแสดงผลลัพธ์ออกมาหลังจาก AJAX เสร็จสิ้นการจัดเตรียมอาร์เรย์ด้วยข้อมูลแบบขนานซึ่งนำไปสู่ผลลัพธ์ที่ทำให้เข้าใจผิด ในกรณีดังกล่าวการโคลนนิ่งหรือการทำให้เป็นวัตถุเป็นวิธีที่จะไป: เนื่องจากเราเข้าสู่ระบบวัตถุที่ซ้ำกันแม้เมื่อ AJAX เสร็จสิ้นการทำงานก็จะกรอกข้อมูล "เก่า"
rr-

18

ในกรณีที่คุณรู้ว่าวัตถุเป็นเพียงบูลีนวันที่สตริงจำนวน ฯลฯ ... ฟังก์ชั่น javascript String () ทำงานได้ดี ฉันเพิ่งพบว่ามีประโยชน์ในการจัดการกับค่าที่มาจากฟังก์ชัน $ .each ของ jquery

ตัวอย่างเช่นต่อไปนี้จะแปลงทุกรายการใน "value" เป็นสตริง:

$.each(this, function (name, value) {
  alert(String(value));
});

รายละเอียดเพิ่มเติมที่นี่:

http://www.w3schools.com/jsref/jsref_string.asp


หรือvar my_string = ''+value+'';
John Magnolia

1
ได้ผลสำหรับฉัน ฉันชอบโซลูชันนี้เพราะฉันจะไม่ใช้ปลั๊กอินสำหรับงานง่ายๆ
Tillito

15
var obj={
name:'xyz',
Address:'123, Somestreet'
 }
var convertedString=JSON.stringify(obj) 
 console.log("literal object is",obj ,typeof obj);
 console.log("converted string :",convertedString);
 console.log(" convertedString type:",typeof convertedString);

12

ฉันกำลังมองหาสิ่งนี้และเขียนสิ่งที่ซ้ำซากอย่างลึกล้ำด้วยการเยื้อง:

function objToString(obj, ndeep) {
  if(obj == null){ return String(obj); }
  switch(typeof obj){
    case "string": return '"'+obj+'"';
    case "function": return obj.name || obj.toString();
    case "object":
      var indent = Array(ndeep||1).join('\t'), isArray = Array.isArray(obj);
      return '{['[+isArray] + Object.keys(obj).map(function(key){
           return '\n\t' + indent + key + ': ' + objToString(obj[key], (ndeep||1)+1);
         }).join(',') + '\n' + indent + '}]'[+isArray];
    default: return obj.toString();
  }
}

การใช้งาน: objToString({ a: 1, b: { c: "test" } })


โปรดทราบว่าหากคุณต้องการป้องกันลูปไม่สิ้นสุดสำหรับวัตถุที่มีการอ้างอิงแบบวงกลมคุณสามารถเพิ่มif(ndeep > MAX_DEPTH_LEVEL){ return '...'; }ฟังก์ชันได้ด้วย MAX_DEPTH_LEVEL เป็นจำนวนเลเยอร์วัตถุสูงสุดที่คุณเลือกเพื่อขุด
SylvainPV

11

หากคุณเพียงต้องการที่จะเห็นวัตถุสำหรับการแก้จุดบกพร่องคุณสามารถใช้

var o = {a:1, b:2} 
console.dir(o)

9

1

JSON.stringify(o);

รายการ: {"a": "1", "b": "2"}

2

var o = {a:1, b:2};
var b=[]; Object.keys(o).forEach(function(k){b.push(k+":"+o[k]);});
b="{"+b.join(', ')+"}";
console.log('Item: ' + b);

รายการ: {a: 1, b: 2}


1
มันจะดีกว่าถ้าคุณพิจารณาเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับคำตอบของคุณ
Harun Diluka Heshan

8

วิธีการ JSON ค่อนข้างด้อยกว่าเอ็นจิ้นตุ๊กแก. toSource () ดั้งเดิม

ดูการตอบสนองของบทความ SOสำหรับการทดสอบเปรียบเทียบ

นอกจากนี้คำตอบข้างต้นอ้างถึงhttp://forums.devshed.com/javascript-development-115/tosource-with-arrays-in-ie-386109.htmlซึ่งเช่น JSON (ซึ่งเป็นบทความอื่นhttp: // www.davidpirek.com/blog/object-to-string-how-to-deserialize-jsonใช้ผ่าน"ซอร์สโค้ดเข้ารหัสรหัส ExtJs JSON" ) ไม่สามารถจัดการการอ้างอิงแบบวงกลมและไม่สมบูรณ์ รหัสด้านล่างแสดงให้เห็นถึงข้อ จำกัด (ข้อผิดพลาด) (แก้ไขเพื่อจัดการอาร์เรย์และวัตถุที่ไม่มีเนื้อหา)

( เชื่อมโยงโดยตรงกับรหัสใน //forums.devshed.com/ ... / tosource-with-arrays-in-ie-386109 )

javascript:
Object.prototype.spoof=function(){
    if (this instanceof String){
      return '(new String("'+this.replace(/"/g, '\\"')+'"))';
    }
    var str=(this instanceof Array)
        ? '['
        : (this instanceof Object)
            ? '{'
            : '(';
    for (var i in this){
      if (this[i] != Object.prototype.spoof) {
        if (this instanceof Array == false) {
          str+=(i.match(/\W/))
              ? '"'+i.replace('"', '\\"')+'":'
              : i+':';
        }
        if (typeof this[i] == 'string'){
          str+='"'+this[i].replace('"', '\\"');
        }
        else if (this[i] instanceof Date){
          str+='new Date("'+this[i].toGMTString()+'")';
        }
        else if (this[i] instanceof Array || this[i] instanceof Object){
          str+=this[i].spoof();
        }
        else {
          str+=this[i];
        }
        str+=', ';
      }
    };
    str=/* fix */(str.length>2?str.substring(0, str.length-2):str)/* -ed */+(
        (this instanceof Array)
        ? ']'
        : (this instanceof Object)
            ? '}'
            : ')'
    );
    return str;
  };
for(i in objRA=[
    [   'Simple Raw Object source code:',
        '[new Array, new Object, new Boolean, new Number, ' +
            'new String, new RegExp, new Function, new Date]'   ] ,

    [   'Literal Instances source code:',
        '[ [], {}, true, 1, "", /./, function(){}, new Date() ]'    ] ,

    [   'some predefined entities:',
        '[JSON, Math, null, Infinity, NaN, ' +
            'void(0), Function, Array, Object, undefined]'      ]
    ])
alert([
    '\n\n\ntesting:',objRA[i][0],objRA[i][1],
    '\n.toSource()',(obj=eval(objRA[i][1])).toSource(),
    '\ntoSource() spoof:',obj.spoof()
].join('\n'));

ซึ่งแสดง:

testing:
Simple Raw Object source code:
[new Array, new Object, new Boolean, new Number, new String,
          new RegExp, new Function, new Date]

.toSource()
[[], {}, (new Boolean(false)), (new Number(0)), (new String("")),
          /(?:)/, (function anonymous() {}), (new Date(1303248037722))]

toSource() spoof:
[[], {}, {}, {}, (new String("")),
          {}, {}, new Date("Tue, 19 Apr 2011 21:20:37 GMT")]

และ

testing:
Literal Instances source code:
[ [], {}, true, 1, "", /./, function(){}, new Date() ]

.toSource()
[[], {}, true, 1, "", /./, (function () {}), (new Date(1303248055778))]

toSource() spoof:
[[], {}, true, 1, ", {}, {}, new Date("Tue, 19 Apr 2011 21:20:55 GMT")]

และ

testing:
some predefined entities:
[JSON, Math, null, Infinity, NaN, void(0), Function, Array, Object, undefined]

.toSource()
[JSON, Math, null, Infinity, NaN, (void 0),
       function Function() {[native code]}, function Array() {[native code]},
              function Object() {[native code]}, (void 0)]

toSource() spoof:
[{}, {}, null, Infinity, NaN, undefined, {}, {}, {}, undefined]

8

จริงๆแล้วมีตัวเลือกง่าย ๆ หนึ่งตัว (สำหรับเบราว์เซอร์และ Node.js) ที่หายไปในคำตอบที่มีอยู่:

console.log('Item: %o', o);

ฉันต้องการสิ่งนี้เนื่องจากJSON.stringify()มีข้อ จำกัด บางอย่าง (เช่นกับโครงสร้างแบบวงกลม)


7

ดูเหมือนว่า JSON จะยอมรับพารามิเตอร์ตัวที่สองที่สามารถช่วยในเรื่องฟังก์ชั่น - ตัวทำซ้ำสิ่งนี้จะช่วยแก้ปัญหาการแปลงด้วยวิธีที่หรูหราที่สุด:

JSON.stringify(object, (key, val) => {
    if (typeof val === 'function') {
      return String(val);
    }
    return val;
  });

5

หากคุณสนใจเกี่ยวกับสตริงวัตถุและอาร์เรย์:

function objectToString (obj) {
        var str = '';
        var i=0;
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                if(typeof obj[key] == 'object')
                {
                    if(obj[key] instanceof Array)
                    {
                        str+= key + ' : [ ';
                        for(var j=0;j<obj[key].length;j++)
                        {
                            if(typeof obj[key][j]=='object') {
                                str += '{' + objectToString(obj[key][j]) + (j > 0 ? ',' : '') + '}';
                            }
                            else
                            {
                                str += '\'' + obj[key][j] + '\'' + (j > 0 ? ',' : ''); //non objects would be represented as strings
                            }
                        }
                        str+= ']' + (i > 0 ? ',' : '')
                    }
                    else
                    {
                        str += key + ' : { ' + objectToString(obj[key]) + '} ' + (i > 0 ? ',' : '');
                    }
                }
                else {
                    str +=key + ':\'' + obj[key] + '\'' + (i > 0 ? ',' : '');
                }
                i++;
            }
        }
        return str;
    }

5

stringify-objectเป็นไลบรารี npm ที่ดีที่จัดทำโดยทีม Yeoman: https://www.npmjs.com/package/stringify-object

npm install stringify-object

แล้ว:

const stringifyObject = require('stringify-object');
stringifyObject(myCircularObject);

เห็นได้ชัดว่ามันน่าสนใจก็ต่อเมื่อคุณมีวัตถุทรงกลมที่อาจล้มเหลวด้วย JSON.stringify();


1
ทำไมทุกคนจะใช้โมดูล NPM สำหรับสิ่งนี้สิ่งนี้สามารถทำได้โดยหนึ่งซับใน JS ธรรมดา? คำตอบนี้ต้องการรายละเอียดว่าทำไมใครถึงทำเช่นนั้น
Zelphir Kaltstahl

บ่อยครั้งที่ lib จะช่วยในกรณีที่ขอบ ฉันใช้มันเพื่อจัดการกับการอ้างอิงแบบวงกลม
Nicolas Zozol

1
สิ่งนี้สมเหตุสมผลมากขึ้นเมื่อมีการเพิ่มหมายเหตุเกี่ยวกับวัตถุทรงกลมเอาการโหวตของฉัน
Zelphir Kaltstahl

4

ดูปลั๊กอินjQuery-JSON

ที่แกนกลางของมันใช้ JSON.stringify แต่กลับไปที่ตัวแยกวิเคราะห์ของตัวเองถ้าเบราว์เซอร์ไม่ได้ใช้มัน


4

เนื่องจาก firefox ไม่ได้ทำให้วัตถุบางอย่างเป็นวัตถุหน้าจอ หากคุณต้องการได้ผลเช่นเดียวกันJSON.stringify(obj)::

function objToString (obj) {
    var tabjson=[];
    for (var p in obj) {
        if (obj.hasOwnProperty(p)) {
            tabjson.push('"'+p +'"'+ ':' + obj[p]);
        }
    }  tabjson.push()
    return '{'+tabjson.join(',')+'}';
}


2
var o = {a:1, b:2};

o.toString=function(){
  return 'a='+this.a+', b='+this.b;
};

console.log(o);
console.log('Item: ' + o);

เนื่องจาก Javascript v1.0 ใช้งานได้ทุกที่ (แม้กระทั่ง IE) นี่เป็นแนวทางแบบเนทีฟและช่วยให้คุณมองวัตถุของคุณในขณะทำการดีบั๊กและในการผลิต https://developer.mozilla.org/en/docs/Web/JavaScript/Reference / Global_Objects / วัตถุ / toString

ตัวอย่างที่มีประโยชน์

var Ship=function(n,x,y){
  this.name = n;
  this.x = x;
  this.y = y;
};
Ship.prototype.toString=function(){
  return '"'+this.name+'" located at: x:'+this.x+' y:'+this.y;
};

alert([new Ship('Star Destroyer', 50.001, 53.201),
new Ship('Millennium Falcon', 123.987, 287.543),
new Ship('TIE fighter', 83.060, 102.523)].join('\n'));//now they can battle!
//"Star Destroyer" located at: x:50.001 y:53.201
//"Millennium Falcon" located at: x:123.987 y:287.543
//"TIE fighter" located at: x:83.06 y:102.523

นอกจากนี้ยังเป็นโบนัส

function ISO8601Date(){
  return this.getFullYear()+'-'+(this.getMonth()+1)+'-'+this.getDate();
}
var d=new Date();
d.toString=ISO8601Date;//demonstrates altering native object behaviour
alert(d);
//IE6   Fri Jul 29 04:21:26 UTC+1200 2016
//FF&GC Fri Jul 29 2016 04:21:26 GMT+1200 (New Zealand Standard Time)
//d.toString=ISO8601Date; 2016-7-29

2

หากคุณสามารถใช้ lodash คุณสามารถทำได้ด้วยวิธีนี้:

> var o = {a:1, b:2};
> '{' + _.map(o, (value, key) => key + ':' + value).join(', ') + '}'
'{a:1, b:2}'

ด้วย lodash map()คุณสามารถวนซ้ำวัตถุได้เช่นกัน สิ่งนี้แมปรายการคีย์ / ค่าทุกรายการแทนสตริง:

> _.map(o, (value, key) => key + ':' + value)
[ 'a:1', 'b:2' ]

และjoin()ใส่รายการอาร์เรย์เข้าด้วยกัน

หากคุณสามารถใช้สตริงเทมเพลต ES6 การทำงานนี้ก็ยัง:

> `{${_.map(o, (value, key) => `${key}:${value}`).join(', ')}}`
'{a:1, b:2}'

โปรดทราบว่าสิ่งนี้จะไม่เรียกซ้ำผ่านวัตถุ:

> var o = {a:1, b:{c:2}}
> _.map(o, (value, key) => `${key}:${value}`)
[ 'a:1', 'b:[object Object]' ]

เช่นเดียวกับโหนดที่util.inspect()จะทำ:

> util.inspect(o)
'{ a: 1, b: { c: 2 } }'

1

หากคุณกำลังใช้เฟรมเวิร์ก Dojo javascript มีฟังก์ชัน build อยู่แล้วเพื่อทำสิ่งนี้: dojo.toJson () ซึ่งจะถูกใช้เช่นนั้น

var obj = {
  name: 'myObj'
};
dojo.toJson(obj);

ซึ่งจะส่งคืนสตริง หากคุณต้องการแปลงวัตถุเป็นข้อมูล json ให้เพิ่มพารามิเตอร์ตัวที่สองของจริง

dojo.toJson(obj, true);

http://dojotoolkit.org/reference-guide/dojo/toJson.html#dojo-tojson


1
/*
    This function is as JSON.Stringify (but if you has not in your js-engine you can use this)
    Params:
        obj - your object
        inc_ident - can be " " or "\t".
        show_types - show types of object or not
        ident - need for recoursion but you can not set this parameter.
*/
function getAsText(obj, inc_ident, show_types, ident) {
    var res = "";
    if (!ident)
        ident = "";
    if (typeof(obj) == "string") {
        res += "\"" + obj + "\" ";
        res += (show_types == true) ? "/* typeobj: " + typeof(obj) + "*/" : "";
    } else if (typeof(obj) == "number" || typeof(obj) == "boolean") {
        res += obj;
        res += (show_types == true) ? "/* typeobj: " + typeof(obj) + "*/" : "";
    } else if (obj instanceof Array) {
        res += "[ ";
        res += show_types ? "/* typeobj: " + typeof(obj) + "*/" : "";
        res += "\r\n";
        var new_ident = ident + inc_ident;
        var arr = [];
        for(var key in obj) {
            arr.push(new_ident + getAsText(obj[key], inc_ident, show_types, new_ident));
        } 
        res += arr.join(",\r\n") + "\r\n";
        res += ident + "]";
    } else {
        var new_ident = ident + inc_ident;      
        res += "{ ";
        res += (show_types == true) ? "/* typeobj: " + typeof(obj) + "*/" : "";
        res += "\r\n";
        var arr = [];
        for(var key in obj) {
            arr.push(new_ident + '"' + key + "\" : " + getAsText(obj[key], inc_ident, show_types, new_ident));
        }
        res += arr.join(",\r\n") + "\r\n";
        res += ident + "}\r\n";
    } 
    return res;
};

ตัวอย่างการใช้:

var obj = {
    str : "hello",
    arr : ["1", "2", "3", 4],
b : true,
    vobj : {
        str : "hello2"
    }
}

var ForReading = 1, ForWriting = 2;
var fso = new ActiveXObject("Scripting.FileSystemObject")
f1 = fso.OpenTextFile("your_object1.txt", ForWriting, true)
f1.Write(getAsText(obj, "\t"));
f1.Close();

f2 = fso.OpenTextFile("your_object2.txt", ForWriting, true)
f2.Write(getAsText(obj, "\t", true));
f2.Close();

your_object1.txt:

{ 
    "str" : "hello" ,
    "arr" : [ 
        "1" ,
        "2" ,
        "3" ,
        4
    ],
    "b" : true,
    "vobj" : { 
        "str" : "hello2" 
    }

}

your_object2.txt:

{ /* typeobj: object*/
    "str" : "hello" /* typeobj: string*/,
    "arr" : [ /* typeobj: object*/
        "1" /* typeobj: string*/,
        "2" /* typeobj: string*/,
        "3" /* typeobj: string*/,
        4/* typeobj: number*/
    ],
    "b" : true/* typeobj: boolean*/,
    "vobj" : { /* typeobj: object*/
        "str" : "hello2" /* typeobj: string*/
    }

}

1
มันจะดีและอธิบายว่าโค้ดทำอะไรและเป็นตัวอย่างของวิธีใช้มัน ขอบคุณ
estemendoza

1

สำหรับตัวอย่างของคุณฉันคิดว่า console.log("Item:",o) จะง่ายที่สุด แต่ console.log("Item:" + o.toString) ก็ยังใช้ได้

การใช้เมธอดหมายเลขหนึ่งใช้ดร็อปดาวน์ที่ดีในคอนโซลดังนั้นวัตถุที่ยาวจะทำงานได้ดี


1
function objToString (obj) {
    var str = '{';
    if(typeof obj=='object')
      {

        for (var p in obj) {
          if (obj.hasOwnProperty(p)) {
              str += p + ':' + objToString (obj[p]) + ',';
          }
      }
    }
      else
      {
         if(typeof obj=='string')
          {
            return '"'+obj+'"';
          }
          else
          {
            return obj+'';
          }
      }



    return str.substring(0,str.length-1)+"}";
}

1

ฉันหวังว่าตัวอย่างนี้จะช่วยสำหรับทุกคนที่ทำงานเกี่ยวกับอาร์เรย์ของวัตถุ

var data_array = [{
                    "id": "0",
                    "store": "ABC"
                },{
                    "id":"1",
                    "store":"XYZ"
                }];
console.log(String(data_array[1]["id"]+data_array[1]["store"]));


0

หากคุณต้องการวิธี minimalist ของการแปลงตัวแปรเป็นสตริงสำหรับสถานการณ์ประเภทการแสดงออกแบบอินไลน์''+variablenameเป็นสิ่งที่ดีที่สุดที่ฉันได้ golfed

หาก 'variablename' เป็นวัตถุและคุณใช้การดำเนินการเชื่อมต่อสตริงว่างเปล่ามันจะทำให้เกิดความรำคาญ[object Object]ซึ่งในกรณีนี้คุณอาจต้องการให้ Gary JSON.stringifyตอบคำตอบupvoted มหาศาลสำหรับคำถามที่โพสต์ซึ่งคุณสามารถอ่านเกี่ยวกับ Mozilla Network Developer ที่เชื่อมโยงในคำตอบว่าที่ด้านบน

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