将对象转换为string

我怎样才能将JavaScript对象转换为string?

例:

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

输出:

对象{a = 1,b = 2} //很好的可读输出:)
Item:[object Object] //不知道里面是什么:(

我build议使用JSON.stringify ,它将对象中的一组variables转换为JSONstring。 大多数现代浏览器本身支持这种方法,但对于那些不支持的方法,可以包含一个JS版本 :

 var obj = { name: 'myObj' }; JSON.stringify(obj); 

当然,要将对象转换为string,您必须使用自己的方法,例如:

 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

或者,如果你没有使用方法(函数作为你的对象的属性),你可能可以使用新的标准(但在旧版浏览器中没有实现,尽pipe你也可以find一个实用工具来帮助它们),JSON .stringify()。 但是,如果对象使用不能序列化为JSON的函数或其他属性,那么这将不起作用。

使用javascript的String()函数。

  String(yourobject); 

要么

 JSON.stringify(yourobject) 

保持简单的console ,你可以使用逗号而不是++会尝试将对象转换为string,而逗号将在控制台中单独显示。

例:

 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

编辑请勿使用此答案,因为它在Internet Explorer中不起作用。 使用加里钱伯斯解决scheme。

toSource()是你正在寻找的function,它会把它写成JSON。

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

一个选项

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

o被打印成一个字符串

另一个选项 (如soktinpk在评论中指出),更好的控制台debuggingIMO:

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

o被打印为一个对象,如果您有更多的字段,则可以向下钻取

这里没有任何解决scheme为我工作。 JSON.stringify似乎是很多人说的,但是它削减了函数,并且在testing它时尝试的一些对象和数组看起来相当破碎。

我做了我自己的解决scheme,至less在Chrome中起作用。 在这里发布,所以任何在Google上查看的人都可以find它。

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

编辑:我知道这个代码可以改进,但只是从来没有做到这一点。 用户安德烈在这里提出了一个改进意见:

这里有一点点改变的代码,可以处理'null'和'undefined',也不会添加过多的逗号。

由于我没有validation过,所以请自担风险。 随意build议任何额外的改进作为评论。

如果你只是输出到控制台,你可以使用console.log('string:', obj) 。 注意逗号

如果你知道对象只是一个布尔值,date,string,数字等…的JavaScript String()函数工作得很好。 我最近发现这对于处理来自jquery的$ .each函数的值很有用。

例如,以下内容将“value”中的所有项目转换为一个string:

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

更多细节在这里:

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

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

我正在寻找这个,并写了一个深刻的recursion缩进:

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

如果您只想查看debugging对象,则可以使用

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

JSON方法比Gecko引擎的.toSource()基元要逊色得多。

请参阅SO文章回应以进行比较testing。

另外, 上面的答案指的是像JSON那样的http://forums.devshed.com/javascript-development-115/tosource-with-arrays-in-ie-386109.html (其他文章http:// 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] 

由于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(',')+'}'; } 

看看jQuery-JSON插件

它的核心是使用JSON.stringify,但是如果浏览器没有实现它,就会回到它自己的parsing器。

如果你只关心string,对象和数组:

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

如果你正在使用Dojo javascript框架,那么已经有一个build的函数来做到这一点:dojo.toJson(),这将使用这样的。

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

这将返回一个string。 如果你想把对象转换成json数据,然后添加第二个参数true。

 dojo.toJson(obj, true); 

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

 /* 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*/ } } 

对于你的例子,我认为console.log("Item:",o)将是最简单的。 但是, console.log("Item:" + o.toString)也可以。

使用方法一号在控制台中使用了一个很好的下拉菜单,所以一个长对象可以很好地工作。

 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)工作,所以这是一种本地方法,在debugging和生产过程中,可以使对象看起来非常费神。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 
 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)+"}"; } 

我希望这个例子能帮助所有正在处理数组对象的人

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

如果你可以使用lodash,你可以这样做:

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

使用lodash map()你也可以迭代对象。 这将每个键/值条目映射到其string表示forms:

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

join()把数组条目放在一起。

如果你可以使用ES6模板string,这也适用于:

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

请注意,这不会通过对象recursion:

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

就像node的util.inspect()一样:

 > util.inspect(o) '{ a: 1, b: { c: 2 } }' 
 setobjToString:function(obj){ var me =this; obj=obj[0]; var tabjson=[]; for (var p in obj) { if (obj.hasOwnProperty(p)) { if (obj[p] instanceof Array){ tabjson.push('"'+p +'"'+ ':' + me.setobjToString(obj[p])); }else{ tabjson.push('"'+p +'"'+':"'+obj[p]+'"'); } } } tabjson.push() return '{'+tabjson.join(',')+'}'; }