Chuyển đổi một đối tượng thành một chuỗi


975

Làm cách nào tôi có thể chuyển đổi một đối tượng JavaScript thành một chuỗi?

Thí dụ:

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

Đầu ra:

Đối tượng {a = 1, b = 2} // đầu ra rất dễ đọc :)
Mục: [Object Object] // không biết bên trong là gì :(


7
Chuyển sang chuỗi để mục đích gì? Bạn có nghĩa là tuần tự hóa để bạn có thể xây dựng đối tượng sau từ chuỗi? Hay chỉ để trưng bày?
Shadow Wizard là Ear For You

19
Tác giả đã mất nhiều năm, nhưng đọc trong tâm trí, sau nhiều năm, tôi đoán, điểm khởi đầu của vấn đề là console.log (obj), hiển thị đối tượng với các thuộc tính, trong khi console.log ('obj:' + obj ) làm việc mất phương hướng khác.
Thủy thủ Danubian

2
chỉ đơn giản là không thể áp dụng thêm hai đối tượng, Nếu chúng ta có thể làm như vậy thì sẽ không có khác biệt về loại giá trị và loại ref.
Nishant Kumar

12
var o = {a: 1, b: 2}; console.log ('Mục:' + JSON.opesify (o))
Nishant Kumar

22
Nếu đó là cho giao diện điều khiển, tôi khuyên bạn nên làm console.log("Item", obj);. Không cần bất cứ điều gì phức tạp.
soktinpk

Câu trả lời:


1333

Tôi khuyên bạn nên sử dụng JSON.stringify, nó chuyển đổi tập hợp các biến trong đối tượng thành chuỗi JSON. Hầu hết các trình duyệt hiện đại đều hỗ trợ phương pháp này một cách tự nhiên, nhưng đối với những trình duyệt không có, bạn có thể bao gồm phiên bản JS :

var obj = {
  name: 'myObj'
};

JSON.stringify(obj);

7
Để tham khảo IE6 và 7 không hỗ trợ này. IE6 không phải là vấn đề lớn vì có rất ít người dùng và một chiến dịch tích cực để tiêu diệt nó ... nhưng vẫn còn khá nhiều người dùng IE7 ngoài kia (phụ thuộc vào cơ sở người dùng của bạn).
MikeMurko

30
Tôi nhận được một "Uncaught TypeError: Chuyển đổi cấu trúc vòng tròn thành JSON". Ngay cả khi có một tham chiếu tròn, tôi vẫn muốn thấy một chuỗi đại diện cho đối tượng của tôi. Tôi có thể làm gì?
Pascal Klein

26
Điều này không hoạt động nếu đối tượng có thuộc tính hàm, ví dụ : foo: function () {...}.
Brock Adams

2
Liên kết đến thư viện JSON không hoạt động nếu được nhấp từ StackOverflow. Sao chép và dán nó vào thanh địa chỉ.
f.ardelian

1
Bạn có thể sử dụng JSON.stringify(obj, null, 2);cho một đầu ra đẹp hơn.
l.poellabauer

126

Sử dụng javascript String () chức năng

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

hoặc xâu chuỗi ()

JSON.stringify(yourobject)

28
var foo = {bar: 1}; Chuỗi (foo); -> "[đối tượng đối tượng]"
Anti Veeranna

1
var foo = {bar: 1}; Chuỗi (foo ['bar']); -> "1"
Vikram Pote

3
Nếu bạn muốn toàn bộ đối tượng dưới dạng chuỗi, hãy sử dụng JSON.opesify (foo)
Vikram Pote

8
JSON.stringify(yourobject)người giúp việc ngày của tôi!
Chất dẫn truyền thần kinh

1
@TranslucentCloud * được thực hiện
Parampal Pooni

87

Chắc chắn, để chuyển đổi một đối tượng thành một chuỗi, bạn phải sử dụng phương thức của riêng mình, chẳng hạn như:

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

Trên thực tế, những điều trên chỉ cho thấy cách tiếp cận chung; bạn có thể muốn sử dụng một cái gì đó như http://phpjs.org/fifts/var_export giáp78 hoặc http: //phpjs.org/fifts/var_dump:604

hoặc, nếu bạn không sử dụng các phương thức (chức năng như các thuộc tính của đối tượng của bạn), bạn có thể sử dụng tiêu chuẩn mới (nhưng không được triển khai trong các trình duyệt cũ hơn, mặc dù bạn cũng có thể tìm thấy một tiện ích để trợ giúp cho chúng), JSON .opesify (). Nhưng một lần nữa, điều đó sẽ không hoạt động nếu đối tượng sử dụng các hàm hoặc các thuộc tính khác không được tuần tự hóa thành JSON.


78

Giữ cho nó đơn giản với console, bạn chỉ có thể sử dụng dấu phẩy thay vì a +. Các +sẽ cố gắng để chuyển đổi các đối tượng vào một chuỗi, trong khi dấu phẩy sẽ hiển thị nó riêng trong giao diện điều khiển.

Thí dụ:

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

Đầu ra:

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

Tham khảo: https://developer.mozilla.org/en-US/docs/Web/API/Console.log


Giải pháp tuyệt vời! Nhưng bạn có thể cho tôi biết những gì xảy ra đằng sau hậu trường khi bạn chỉ đơn giản làm điều này : console.log(o)? Vì nếu bạn cố gắng đăng nhập một đối tượng được thêm vào một chuỗi, nó thực sự gọi toString()đối tượng đó.
Gocy015

1
console.logcuối cùng gọi một cái gì đó được gọi là Printerthông số kỹ thuật ghi chú: "Cách triển khai in lập luận tùy thuộc vào việc triển khai" - có nghĩa là mọi trình duyệt có thể làm điều này khác nhau (xem console.spec.whatwg.org/#printer ). Firefox sẽ hiển thị các đối tượng dưới dạng một chuỗi, nhưng được tô màu độc đáo. Chrome sẽ hiển thị đối tượng dưới dạng một nhóm tương tác mà bạn có thể mở rộng để xem các thuộc tính. Hãy thử một lần!
Lu-ca

2
Thủ thuật rất hay và có lẽ tốt cho các trình duyệt web hiện đại, nhưng nó không đáng tin cậy 100% cho tất cả các triển khai JS. ví dụ: trong Qt QML, thực thi một công cụ JS, đầu ra cho console.log('Item: ', o);vẫn còn Item: [object Object].
Paul Masri-Stone

Thay vì console.logbạn có thể sử dụng console.dir(o)để in đối tượng javascript thay vì in nó dưới dạng chuỗi. Trong các công cụ dành cho nhà phát triển, điều này cho phép mở đối tượng và kiểm tra tất cả các thuộc tính, thậm chí cả mảng. (xem: developer.mozilla.org/de/docs/Web/API/Console/dir )
EagleT

37

EDIT Không sử dụng câu trả lời này vì nó không hoạt động trong Internet Explorer. Sử dụng giải pháp Gary Chambers .

toSource () là hàm bạn đang tìm kiếm sẽ viết nó dưới dạng JSON.

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

6
Mặc dù nó thuận tiện cho việc gỡ lỗi trong Firefox, toSource()nhưng không hoạt động trong IE.
Brett Zamir

4
toSource()không phải là một tiêu chuẩn được công nhận, vì vậy không thể được đảm bảo để được hỗ trợ trong tất cả các trình duyệt.
Gary Chambers

11
Ahh, cảm ơn bạn đã chỉ ra điều đó. Tôi sẽ để lại câu trả lời của tôi ở đây cho những người khác không biết về điều đó.
Gazler

Tôi ước tôi có thể nâng cao bạn nhiều hơn, vì đây là một giải pháp tuyệt vời cho các môi trường có javascript (nhưng nhật ký giao diện điều khiển không thuận tiện / không thể truy cập).
Zack Morris

Bạn có thể cung cấp một polypill cho toSource: github.com/oliver-moran/toSource.js/blob/master/toSource.js
roland

32

Một lựa chọn :

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

o được in dưới dạng chuỗi

Một tùy chọn khác (như soktinpk đã chỉ ra trong các bình luận) và tốt hơn cho việc gỡ lỗi giao diện điều khiển IMO:

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

o được in dưới dạng một đối tượng, mà bạn có thể truy sâu xuống nếu bạn có nhiều trường hơn


22

Không có giải pháp nào ở đây làm việc cho tôi. JSON.opesify dường như là những gì nhiều người nói, nhưng nó cắt bỏ các chức năng và dường như khá bị hỏng đối với một số đối tượng và mảng tôi đã thử khi kiểm tra nó.

Tôi đã tạo ra giải pháp của riêng mình, hoạt động trong Chrome ít nhất. Đăng nó ở đây để bất cứ ai tìm kiếm nó trên Google đều có thể tìm thấy nó.

//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("")
}

EDIT: Tôi biết mã này có thể được cải thiện nhưng không bao giờ có xung quanh để làm điều đó. Người dùng andrey đề xuất một cải tiến ở đây với nhận xét:

Dưới đây là một chút mã được thay đổi, có thể xử lý 'null' và 'không xác định' và cũng không thêm dấu phẩy quá mức.

Sử dụng nó có nguy cơ của riêng bạn như tôi chưa xác minh nó. Hãy đề nghị bất kỳ cải tiến bổ sung như là một nhận xét.


Bạn đang thiếu một số '}'
dacopenhagen

2
Mã rất đẹp, nhưng có một dấu ,ở cuối mỗi đối tượng / mảng.
Nick Newman

đây là câu trả lời hay nhất
La Mã

20

Nếu bạn chỉ xuất ra giao diện điều khiển, bạn có thể sử dụng console.log('string:', obj). Chú ý dấu phẩy .


Điều này đặt ra các vấn đề trong các tình huống trong đó AJAX và hoãn lại phát - đầu ra từ console.logthường được hiển thị sau khi AJAX hoàn thành việc cung cấp dữ liệu cho mảng với dữ liệu song song, dẫn đến kết quả sai lệch. Trong các trường hợp như vậy, nhân bản hoặc tuần tự hóa các đối tượng là cách để thực hiện: vì chúng tôi đã ghi lại đối tượng trùng lặp, ngay cả khi AJAX hoàn thành công việc của nó, nó sẽ điền dữ liệu "cũ".
rr-

18

Trong trường hợp bạn biết đối tượng chỉ là Boolean, Date, String, number, v.v ... Hàm javascript String () hoạt động tốt. Gần đây tôi thấy điều này hữu ích trong việc xử lý các giá trị đến từ hàm $ .each của jquery.

Ví dụ: phần sau đây sẽ chuyển đổi tất cả các mục trong "value" thành một chuỗi:

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

Thêm chi tiết tại đây:

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


Hoặcvar my_string = ''+value+'';
John Magnolia

1
Làm việc cho tôi. Tôi thích giải pháp này vì tôi sẽ không sử dụng plugin cho một nhiệm vụ đơn giản như vậy.
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

Tôi đã tìm kiếm điều này, và đã viết một bài đệ quy sâu với sự thụt lề:

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

Sử dụng : objToString({ a: 1, b: { c: "test" } })


lưu ý rằng nếu bạn muốn ngăn các vòng lặp vô hạn cho các đối tượng có tham chiếu vòng tròn, bạn có thể thêm if(ndeep > MAX_DEPTH_LEVEL){ return '...'; }vào hàm, với MAX_DEPTH_LEVEL là số lớp đối tượng tối đa được chọn của bạn để đào.
SylvainPV 15/03/2015

11

Nếu bạn chỉ muốn xem đối tượng để gỡ lỗi, bạn có thể sử dụng

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

9

1.

JSON.stringify(o);

Mục: {"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);

Mục: {a: 1, b: 2}


1
Sẽ tốt hơn nếu bạn xem xét thêm chi tiết về câu trả lời của bạn.
Harun Diluka Heshan

8

Các phương thức JSON khá thua kém so với công cụ Gecko .toSource () nguyên thủy.

Xem phản hồi bài viết SO để kiểm tra so sánh.

Ngoài ra, câu trả lời ở trên đề cập đến http://forums.devshed.com/javascript-development-115/tosource-with-arrays-in-ie-386109.html , giống như JSON, (mà bài viết khác http: // www.davidpirek.com/blog/object-to-opes-how-to-deserialize-json sử dụng thông qua "Mã nguồn mã hóa JSON của ExtJs" ) không thể xử lý các tham chiếu vòng và không đầy đủ. Mã dưới đây cho thấy các hạn chế (giả mạo) của nó (được sửa để xử lý các mảng và các đối tượng không có nội dung).

( liên kết trực tiếp đến mã trong //forums.devshed.com/ ... / tosource-with-mảng-in-eg-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'));

Hiển thị:

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

Thực tế, có một tùy chọn dễ dàng (đối với các trình duyệt gần đây và Node.js) bị thiếu trong các câu trả lời hiện có:

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

Tôi thích điều này vì JSON.stringify()có những hạn chế nhất định (ví dụ với các cấu trúc tròn).


7

Dường như JSON chấp nhận tham số thứ hai có thể trợ giúp với các hàm - thay thế , điều này giải quyết vấn đề chuyển đổi theo cách thanh lịch nhất:

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

5

Nếu bạn chỉ quan tâm đến chuỗi, đối tượng và mảng:

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-objectlà một thư viện npm tốt được tạo bởi nhóm yeoman: https://www.npmjs.com/package/opesify-object

npm install stringify-object

sau đó:

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

Rõ ràng chỉ thú vị nếu bạn có đối tượng hình tròn sẽ thất bại với JSON.stringify();


1
Tại sao mọi người sẽ sử dụng một mô-đun NPM cho một cái gì đó như thế này, có thể đạt được bằng một lớp lót trong JS đơn giản? Câu trả lời này cần chi tiết về lý do tại sao bất cứ ai sẽ làm như vậy.
Zelphir Kaltstahl

Như thường lệ, một lib sẽ giúp trong trường hợp cạnh. Tôi đã sử dụng nó để đối phó với các tài liệu tham khảo tròn.
Nicolas Zozol

1
Điều này có ý nghĩa hơn với ghi chú được thêm vào về các đối tượng hình tròn, loại bỏ downvote của tôi.
Zelphir Kaltstahl

4

Hãy xem plugin jQuery-JSON

Về cốt lõi, nó sử dụng JSON.opesify nhưng quay lại trình phân tích cú pháp của chính nó nếu trình duyệt không triển khai nó.


4

Vì firefox không xâu chuỗi một số đối tượng làm đối tượng màn hình; nếu bạn muốn có kết quả tương tự như 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(',')+'}';
}

4

Đối với các đối tượng không lồng nhau:

Object.entries(o).map(x=>x.join(":")).join("\r\n")

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

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

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

Vì Javascript v1.0 hoạt động ở mọi nơi (ngay cả IE), đây là cách tiếp cận nguyên gốc và cho phép giao diện đối tượng của bạn rất tốn kém trong khi gỡ lỗi và trong sản xuất https://developer.mozilla.org/en/docs/Web/JavaScript/Reference / Global_Objects / Object / toString

Ví dụ hữu ích

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

Ngoài ra, như một phần thưởng

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

Nếu bạn có thể sử dụng lodash, bạn có thể làm theo cách này:

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

Với lodash, map()bạn cũng có thể lặp lại các Đối tượng. Điều này ánh xạ mọi mục nhập khóa / giá trị đến biểu diễn chuỗi của nó:

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

join()đặt các mục mảng với nhau.

Nếu bạn có thể sử dụng Chuỗi mẫu ES6, điều này cũng hoạt động:

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

Xin lưu ý rằng điều này không đi theo đệ quy thông qua Đối tượng:

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

Giống như nútutil.inspect() sẽ làm:

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

1

Nếu bạn đang sử dụng khung javascript Dojo thì đã có chức năng xây dựng để thực hiện việc này: dojo.toJson () sẽ được sử dụng như vậy.

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

Nó sẽ trả về một chuỗi. Nếu bạn muốn chuyển đổi đối tượng thành dữ liệu json thì hãy thêm tham số thứ hai là true.

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

ví dụ để sử dụng:

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
Nó sẽ là tốt và giải thích về những gì mã làm và một ví dụ về cách sử dụng nó. Cảm ơn
estemendoza

1

Ví dụ của bạn, tôi nghĩ console.log("Item:",o) sẽ dễ nhất. Nhưng, console.log("Item:" + o.toString) cũng sẽ làm việc.

Sử dụng phương thức số một sử dụng một trình đơn thả xuống đẹp trong bảng điều khiển, vì vậy một đối tượng dài sẽ hoạt động tốt.


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

Tôi hy vọng ví dụ này sẽ giúp ích cho tất cả những ai đang làm việc trên mảng các đối tượng

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

1

Nếu bạn không tham gia () vào Object.

const obj = {one:1, two:2, three:3};
let arr = [];
for(let p in obj)
    arr.push(obj[p]);
const str = arr.join(',');

0

Nếu bạn muốn một phương thức tối giản để chuyển đổi một biến thành một chuỗi cho một tình huống loại biểu thức nội tuyến, ''+variablename là cách tốt nhất mà tôi đã chơi.

Nếu 'matrixblename' là một đối tượng và bạn sử dụng thao tác nối chuỗi rỗng, nó sẽ gây khó chịu [object Object], trong trường hợp đó bạn có thể muốn JSON.stringifycâu trả lời được nâng cao của Gary C. cho câu hỏi đã đăng, bạn có thể đọc về Mạng nhà phát triển của Mozilla tại liên kết trong câu trả lời đó ở đầu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.