Преобразование объекта в строку - PullRequest
904 голосов
/ 10 апреля 2011

Как я могу преобразовать объект JavaScript в строку?

Пример:

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

Выход:

Object {a = 1, b = 2} // очень хороший читаемый вывод:)
Item: [object Object] // не знаю, что внутри: (

Ответы [ 33 ]

11 голосов
/ 19 ноября 2014

Я искал это и написал глубоко рекурсивный с отступом:

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

10 голосов
/ 24 ноября 2014

Если вы просто хотите увидеть объект для отладки, вы можете использовать

var o = {a:1, b:2} 
console.dir(o)
7 голосов
/ 20 апреля 2011

Методы JSON значительно уступают примитиву движка Gecko .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 через "Исходный код кодирования JSON ExtJs" ), не может обрабатывать циклические ссылкии является неполным.Приведенный ниже код демонстрирует его ограничения (подделку) (исправлено для обработки массивов и объектов без содержимого).

( прямая ссылка на код в //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]
7 голосов
/ 04 марта 2018

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}

4 голосов
/ 11 октября 2015

Если вы заботитесь только о строках, объектах и ​​массивах:

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;
    }
4 голосов
/ 13 февраля 2019

На самом деле в существующих ответах отсутствует один простой вариант (для последних браузеров и Node.js):

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

Я бы предпочел это, поскольку JSON.stringify() имеет определенные ограничения (например, с круговыми структурами).

4 голосов
/ 29 июля 2013

Поскольку 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(',')+'}';
}
3 голосов
/ 01 мая 2012

Взгляните на плагин jQuery-JSON

По своей сути он использует JSON.stringify, но возвращается к своему собственному парсеру, если браузер не реализует его.

3 голосов
/ 25 апреля 2019

Похоже, JSON принимает второй параметр, который может помочь с функциями - replacer , это решает проблему преобразования самым элегантным способом:

JSON.stringify(object, (key, val) => {
    if (typeof val === 'function') {
      return String(val);
    }
    return val;
  });
3 голосов
/ 29 декабря 2017

stringify-object - хорошая библиотека npm, созданная йоменской командой: https://www.npmjs.com/package/stringify-object

npm install stringify-object

тогда:

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

Очевидно, что это интересно, только если у вас есть круглый объект, который потерпит неудачу с JSON.stringify();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...