如何以字符串格式显示JavaScript对象的内容,就像我们警告变量时一样?

与显示对象的格式相同。


当前回答

在NodeJS中,您可以使用util.inspect(obj)打印对象。请务必说明深度,否则只能打印出对象的浅层。

其他回答

循环引用解决方案

要从包含重复引用(在许多地方对同一对象的引用)(包括循环引用)的对象中生成不包含冗余信息的字符串,请使用JSON.stringify和replacer(在代码段中显示),如下所示

let s = JSON.stringify(obj, refReplacer(), 4);

函数refReplacer(){设m=new Map(),v=new Map),init=null;返回函数(字段,值){让p=m.get(this)+(Array.isArray(this)`[${field}]“:”.“+字段);让isComplex=value==对象(值)如果(isComplex)m.set(值,p);让pp=v.get(value)||'';let path=p.replace(/未定义\.\?/,“”);让val=pp`#REF:${pp[0]==“[”?“$”:“$.”}${pp}“:value;!初始化?(init=value):(val===init?val=“#REF:$”:0);if(!pp&&isComplex)v.set(value,path);返回值;}}// ---------------//测试// ---------------//具有重复引用的gen obj设a={a1:1,a2:2};设b={b1:3,b2:“4”};让obj={o1:{o2:a},b,a};//重复引用a.a3=[1,2,b];//循环引用b.b3=a;//循环引用让s=JSON.stringify(obj,refReplacer(),4);console.log;警报;

基于此(更多信息)的此解决方案为每个对象值创建类似JSONPath的路径,如果同一对象出现两次(或更多),则使用此路径的引用来引用该对象,例如#REF:$.bar.arr[3].foo(其中$表示主对象),而不是“渲染”整个对象(冗余度较低)

奖金:倒置

函数parseRefJSON(json){let objToPath=新映射();let pathToObj=新映射();let o=JSON.parse(JSON);让遍历=(父级,字段)=>{让obj=父级;let path=“#REF:$”;if(字段!==未定义){obj=父[字段];path=objToPath.get(父)+(Array.isArray(父)`[${field}]`:`${field?'。'+字段:''}`);}objToPath.set(obj,路径);pathToObj.set(路径,对象);let ref=路径目标获取(obj);如果(ref)父[字段]=ref;for(让f在obj中)if(obj==对象(obj))遍历(obj,f);}横向(o);返回o;}// ------------//测试// ------------设s=`{“o1”:{“o2”:{“a1”:1,“a2”:2,“a3”:[1.2.{“b1”:3,“b2”:“4”,“b3”:“#REF:$.o1.o2”}]}},“b”:“#REF:$.o1.o2.a3[2]”,“a”:“#REF:$.o1.o2”}`;console.log('打开Chrome控制台查看嵌套字段');let obj=parseRefJSON;console.log(obj);

功能:

var print = function(o){
    var str='';

    for(var p in o){
        if(typeof o[p] == 'string'){
            str+= p + ': ' + o[p]+'; </br>';
        }else{
            str+= p + ': { </br>' + print(o[p]) + '}';
        }
    }

    return str;
}

用法:

var myObject = {
    name: 'Wilson Page',
    contact: {
        email: 'wilson@hotmail.com',
        tel: '123456789'
    }  
}

$('body').append( print(myObject) );

例子:

http://jsfiddle.net/WilsonPage/6eqMn/

好吧,Firefox(感谢@Bojangles提供详细信息)有Object.toSource()方法,它将对象打印为JSON和function(){}。

我想,对于大多数调试目的来说,这已经足够了。

我使用了pagewil的打印方法,效果非常好。

这是我的略微扩展版本,带有(草率的)缩进和不同的prop/ob分隔符:

var print = function(obj, delp, delo, ind){
    delp = delp!=null ? delp : "\t"; // property delimeter
    delo = delo!=null ? delo : "\n"; // object delimeter
    ind = ind!=null ? ind : " "; // indent; ind+ind geometric addition not great for deep objects
    var str='';

    for(var prop in obj){
        if(typeof obj[prop] == 'string' || typeof obj[prop] == 'number'){
          var q = typeof obj[prop] == 'string' ? "" : ""; // make this "'" to quote strings
          str += ind + prop + ': ' + q + obj[prop] + q + '; ' + delp;
        }else{
          str += ind + prop + ': {'+ delp + print(obj[prop],delp,delo,ind+ind) + ind + '}' + delo;
        }
    }
    return str;
};

最简单的答案

我很惊讶,这没有一个更简单的答案,只是一群人重复着完全相同的2件事,还有一些人用不可读的代码。。。

干得好。如果您只需要将对象作为字符串(无嵌套级别):

function prettyStringifyObject(obj: Record < any, any > ) {
  let result = ''
  for (const key in obj) {
    result = `${result}${result !== '' ? ', ' : ''}${key}: ${Array.isArray(obj[key]) ? `[${obj[key]}]` : obj[key]}`
  }
  return `{${result}}`
}

测验

使用测试

const someTestObject = {
  data: [1, 2, 3, "4"],
  aString: "awdasdyhblhyb",
  aBoolean: true,
  aNumber: 50,
  aNull: null
  aNestedObject: {
    someOtherData: [],
    isNested: true
  }
}

console.log(prettyStringifyObject(someTestObject))

结果:

"{data: [1,2,3,4], aString: awdasdyhblhyb, aBoolean: true, aNumber: 50, aNull: null, aNestedObject: [object Object]}"

你可以看看我在这里做的JSFiddle