JavaScriptオブジェクトを文字列に変換するにはどうすればよいですか?
例:
var o = {a:1, b:2}
console.log(o)
console.log('Item: ' + o)
出力:
Object {a = 1、b = 2} //非常に読みやすい出力:)
Item:[object Object] //何が入っているかわからない:(
console.log("Item", obj);
ます。複雑なものは必要ありません。
JavaScriptオブジェクトを文字列に変換するにはどうすればよいですか?
例:
var o = {a:1, b:2}
console.log(o)
console.log('Item: ' + o)
出力:
Object {a = 1、b = 2} //非常に読みやすい出力:)
Item:[object Object] //何が入っているかわからない:(
console.log("Item", obj);
ます。複雑なものは必要ありません。
回答:
JSON.stringify
オブジェクト内の変数のセットをJSON文字列に変換するを使用することをお勧めします。最新のブラウザのほとんどは、このメソッドをネイティブでサポートしていますが、サポートしていない場合は、JSバージョンを含めることができます。
var obj = {
name: 'myObj'
};
JSON.stringify(obj);
foo: function () {...}
。例:。
JSON.stringify(obj, null, 2);
よりきれいな出力に使用できます。
javascript String()関数を使用する
String(yourobject); //returns [object Object]
またはstringify()
JSON.stringify(yourobject)
JSON.stringify(yourobject)
今日はメイド!
もちろん、オブジェクトを文字列に変換するには、次のような独自のメソッドを使用する必要があります。
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()。しかし、繰り返しになりますが、オブジェクトがJSONにシリアル化できない関数やその他のプロパティを使用している場合は機能しません。
をシンプルに保つ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()
そのオブジェクトが呼び出されます。
console.log
最終的にはPrinter
、仕様に記載されているものと呼ばれるものを呼び出します。「実装がどのように引数を出力するかは実装次第です」-つまり、すべてのブラウザがこれを異なる方法で実行できます(console.spec.whatwg.org/#printerを参照)。Firefoxはオブジェクトを文字列として表示しますが、色はきれいです。Chromeでは、オブジェクトをインタラクティブグループとして表示し、展開してプロパティを表示できます。試してみる!
console.log('Item: ', o);
はまだItem: [object Object]
です。
console.log
するために使用できconsole.dir(o)
ます。開発者ツールでは、これにより、オブジェクトを開いて、すべてのプロパティ(配列も含む)をチェックできます。(参照:developer.mozilla.org/de/docs/Web/API/Console/dir)
編集 Internet Explorerでは機能しないため、この回答は使用しないでください。Gary Chambersソリューションを使用します。
toSource()はあなたが探している関数で、それをJSONとして書き出します。
var object = {};
object.first = "test";
object.second = "test2";
alert(object.toSource());
toSource()
、IE では機能しません。
toSource()
は標準として認識されていないため、すべてのブラウザでサポートされる保証はありません。
ここでの解決策はどれも私にとってうまくいきませんでした。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("")
}
編集:私はこのコードが改善できることを知っていますが、それを実行することはできませんでした。ユーザーアンドレイは、改善を提案し、ここでコメントして:
これは少し変更されたコードで、 'null'と 'undefined'を処理でき、余分なコンマを追加しません。
確認はしていませんので、自己責任でご利用ください。コメントとして追加の改善を提案してください。
,
、各オブジェクト/配列の最後に末尾があります。
コンソールに出力するだけの場合は、を使用できますconsole.log('string:', obj)
。コンマに注意してください。
console.log
が表示されることが多く、誤解を招く結果になります。そのような場合、オブジェクトのクローンまたはシリアル化が適切です。複製したオブジェクトをログに記録するため、AJAXが作業を終了しても、「古い」データが書き込まれます。
オブジェクトがブール値、日付、文字列、数値などであることがわかっている場合は、javascriptのString()関数が適切に機能します。私は最近、これがjqueryの$ .each関数からの値を処理するのに役立つとわかりました。
たとえば、次のコードは「値」のすべてのアイテムを文字列に変換します。
$.each(this, function (name, value) {
alert(String(value));
});
詳細はこちら:
var my_string = ''+value+'';
私はこれを探していて、インデント付きの深い再帰的なものを書きました:
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を掘るためのオブジェクトレイヤーの選択した最大数であることと、関数の中で。
デバッグのためにオブジェクトを見たいだけなら、あなたは使うことができます
var o = {a:1, b:2}
console.dir(o)
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}
JSONメソッドは、Geckoエンジンの.toSource()プリミティブよりもかなり劣っています。
比較テストについては、SO記事の応答を参照してください。
また、上記の答えはJSONのようなhttp://forums.devshed.com/javascript-development-115/tosource-with-arrays-in-ie-386109.htmlを参照しています(他の記事http:// www.davidpirek.com/blog/object-to-string-how-to-deserialize-json uses "ExtJs JSON encode source code")は循環参照を処理できず、不完全です。以下のコードは、その(スプーフィング)制限(コンテンツのない配列とオブジェクトを処理するように修正)を示しています。
(//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]
既存の回答に欠けている実際の1つの簡単なオプション(最近のブラウザーとNode.js)があります。
console.log('Item: %o', o);
これにJSON.stringify()
は特定の制限があるため(たとえば、環状構造の場合)、これを好みます。
文字列、オブジェクト、配列のみに関心がある場合:
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;
}
stringify-object
yeomanチームによって作成された優れたnpmライブラリです。https://www.npmjs.com/package/stringify-object
npm install stringify-object
次に:
const stringifyObject = require('stringify-object');
stringifyObject(myCircularObject);
明らかにそれが失敗する円形オブジェクトがある場合にのみ興味深いです JSON.stringify();
jQuery-JSONプラグインを見てください
基本的には、JSON.stringifyを使用しますが、ブラウザが実装していない場合は独自のパーサーにフォールバックします。
ネストされていないオブジェクトの場合:
Object.entries(o).map(x=>x.join(":")).join("\r\n")
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を含む)で機能するため、これはネイティブアプローチであり、デバッグ中および本番環境でのオブジェクトの非常にコストのかかる外観を可能にします 。 / Global_Objects / Object / 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
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 } }'
Dojo javascriptフレームワークを使用している場合、これを行うための組み込み関数が既に存在します。dojo.toJson()は、このように使用されます。
var obj = {
name: 'myObj'
};
dojo.toJson(obj);
文字列を返します。オブジェクトをjsonデータに変換する場合は、trueの2番目のパラメーターを追加します。
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*/
}
}
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)+"}";
}
Object()へのjoin()を実行しない場合。
const obj = {one:1, two:2, three:3};
let arr = [];
for(let p in obj)
arr.push(obj[p]);
const str = arr.join(',');