(이것은 GitHub의 내 라이브러리에 추가되었습니다 )
바퀴를 재발 명! 이 솔루션 중 어느 것도 내 상황에 효과가 없었습니다. 그래서 나는 wilsonpage 의 대답을 빨리 닥쳤다 . 이것은 콘솔, 텍스트 필드 등을 통해 화면에 인쇄하기위한 것이 아닙니다. 이러한 상황에서는 제대로 작동하고 OP가 요청 한대로 작동합니다 alert
. 여기에 많은 답변 alert
이 OP 요청대로 사용하지 않습니다 . 그러나 데이터 전송 형식으로되어 있습니다. 이 버전은와 매우 유사한 결과를 반환하는 것 같습니다 toSource()
. 나는에 대해 테스트하지 JSON.stringify
않았지만 이것이 거의 같은 것으로 가정합니다. 이 버전은 모든 환경에서 사용할 수 있도록 폴리 파일과 비슷합니다. 이 함수의 결과는 유효한 Javascript 객체 선언입니다.
이 같은 것이 이미 어딘가에 있었는지 의심 할 여지가 없지만 과거 답변을 검색하는 데 시간을 보내는 것보다 짧았습니다. 그리고이 질문은 내가 이것에 대해 검색하기 시작할 때 Google에서 가장 큰 인기를 얻었 기 때문에; 나는 그것을 여기에 두는 것이 다른 사람들을 도울 것이라고 생각했다.
어쨌든이 함수의 결과는 객체에 객체와 배열이 포함되어 있고 객체 나 배열에 객체와 배열이 더 포함되어 있어도 객체의 문자열 표현이됩니다. (나는 당신이 마시는 것을 좋아한다고 들었습니까? 그래서, 나는 당신의 차를 냉각기로 포주했습니다. 그리고 나서, 당신의 냉각기를 냉각기로 포주했습니다.
배열은 []
대신에 저장 {}
되므로 키 / 값 쌍이 없으며 값만 있습니다. 일반 배열처럼. 따라서 배열처럼 생성됩니다.
또한 모든 문자열 (키 이름 포함)이 인용되므로 문자열에 공백이나 슬래시와 같은 특수 문자가없는 한 필요하지 않습니다. 그러나 나는 여전히 잘 작동하는 따옴표를 제거하기 위해 이것을 감지하고 싶지 않았습니다.
그런 다음이 결과 문자열을 사용하여 eval
또는 문자열을 통해 var 조작으로 덤프 할 수 있습니다. 따라서 텍스트에서 객체를 다시 생성하십시오.
function ObjToSource(o){
if (!o) return 'null';
var k="",na=typeof(o.length)=="undefined"?1:0,str="";
for(var p in o){
if (na) k = "'"+p+ "':";
if (typeof o[p] == "string") str += k + "'" + o[p]+"',";
else if (typeof o[p] == "object") str += k + ObjToSource(o[p])+",";
else str += k + o[p] + ",";
}
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
내가 모두 엉망으로 만들면 알려주십시오. 내 테스트에서 잘 작동합니다. 또한 유형을 감지하려고 생각할 수있는 유일한 방법 array
은의 존재를 확인하는 것입니다 length
. Javascript는 실제로 배열을 객체로 저장하기 때문에 실제로 유형을 확인할 수 array
없습니다 (이러한 유형은 없습니다!). 다른 사람이 더 나은 방법을 알고 있다면 듣고 싶습니다. 객체에 이름 length
이 지정된 속성 이 있으면이 함수는 실수로 객체를 배열로 취급하기 때문입니다.
편집 : null 값 객체에 대한 검사가 추가되었습니다. 감사합니다 브록 아담스
편집 : 아래는 무한 재귀 객체를 인쇄 할 수있는 고정 기능입니다. 무한 재귀를 한 번 인쇄 toSource
하기 때문에 FF 에서와 동일하게 인쇄되지 않습니다 toSource
. 이 함수는 위의 함수보다 느리게 실행되므로 위의 함수를 편집하는 대신 여기에 추가합니다. 어딘가에 자신에게 다시 연결된 개체를 전달하려는 경우에만 필요합니다.
const ObjToSource=(o)=> {
if (!o) return null;
let str="",na=0,k,p;
if (typeof(o) == "object") {
if (!ObjToSource.check) ObjToSource.check = new Array();
for (k=ObjToSource.check.length;na<k;na++) if (ObjToSource.check[na]==o) return '{}';
ObjToSource.check.push(o);
}
k="",na=typeof(o.length)=="undefined"?1:0;
for(p in o){
if (na) k = "'"+p+"':";
if (typeof o[p] == "string") str += k+"'"+o[p]+"',";
else if (typeof o[p] == "object") str += k+ObjToSource(o[p])+",";
else str += k+o[p]+",";
}
if (typeof(o) == "object") ObjToSource.check.pop();
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
테스트:
var test1 = new Object();
test1.foo = 1;
test1.bar = 2;
var testobject = new Object();
testobject.run = 1;
testobject.fast = null;
testobject.loop = testobject;
testobject.dup = test1;
console.log(ObjToSource(testobject));
console.log(testobject.toSource());
결과:
{'run':1,'fast':null,'loop':{},'dup':{'foo':1,'bar':2}}
({run:1, fast:null, loop:{run:1, fast:null, loop:{}, dup:{foo:1, bar:2}}, dup:{foo:1, bar:2}})
참고 : 인쇄 document.body
하는 것은 끔찍한 예입니다. 우선, FF는를 사용할 때 빈 객체 문자열을 인쇄합니다 toSource
. 그리고 위의 기능을 사용할 때 FF가 발생합니다 SecurityError: The operation is insecure.
. 그리고 Chrome에서 충돌합니다 Uncaught RangeError: Maximum call stack size exceeded
. 분명히 document.body
문자열로 변환되지 않았습니다. 특정 속성에 액세스하기에는 너무 크거나 보안 정책에 위배되기 때문입니다. 내가 여기서 뭔가 엉망이 아니라면 말하지 마라!