此文只考虑 :基本类型, 数组, 和 Object 类型.
一、构造函数处理数据
class ToJSONString extends String {
toString() {
return `"${ this.valueOf() }"`;
}
}
class ToJSONObject extends Object {
type() {
return 'ToJSONObject';
}
toString() {
let ret = [];
let keys = Object.keys(this);
for (let i = 0, len = keys.length; i < len; i++) {
ret.push(`"${ keys[ i ]}":${ this[ keys[ i ] ] }`);
}
return `{${ret.join( ',' )}}`;
}
}
class ToJSONArray extends Array {
type() {
return 'ToJSONArray';
}
toString() {
return `[${this.join( ',' )}]`;
}
}
二、类型判断的工具函数
function isPrimaryType(value) {
let type = typeof value;
return type === 'number' ||
type === 'string' ||
type === 'boolean';
}
function isFunction(value) {
return typeof value === 'function';
}
//类型判断函数
function gettype(value) {
if (isPrimaryType(value)) {
return typeof value;
}
if (isFunction(value)) {
return 'Function';
}
if (value.type && typeof value.type === 'function') {
return value.type();
}
// [object Object]
return Object.prototype.toString.call(value).slice(8).slice(0, -1);
}
三、数据转换
function create(target) {
if (isPrimaryType(target)) {
return [gettype(target) === 'string' ? new ToJSONString(target) : target, true];
}
if (gettype(target) === 'Object') {
return [new ToJSONObject(), false];
}
if (gettype(target) === 'Array') {
return [new ToJSONArray(), false];
}
return [null, true];
}
//复杂类型数据需要用递归来处理
function trace(target) {
let [o, isPrimary] = create(target);
if (!isPrimary) {
let t = gettype(o);
switch (t) {
case 'ToJSONObject': {
let keys = Object.keys(target);
for (let i = 0, len = keys.length; i < len; i++) {
o[keys[i]] = trace(target[keys[i]]);
}
}
break;
case 'ToJSONArray': {
for (let i = 0, len = target.length; i < len; i++) {
o[i] = trace(target[i]);
}
}
break;
}
}
return o;
}
四、测试
function toJSON(target) {
return trace(target).toString();
}
let o = {
name: "jim",
arr: [1, 2, 3, "4", '5'],
test1: 1,
test2: true,
test: {
name: 'jim',
age: 19,
gender: true
}
};
let res = toJSON(o)
console.log(res);
//打印出来的结果
{"name":"jim","arr":[1,2,3,"4","5"],"test1":1,"test2":true,"test":{"name":"jim","age":19,"gender":true}}
完成啦~~~~此文思路来源GitHub上的蒋坤老师,非常感谢!!!
附完整代码:
class ToJSONString extends String {
toString() {
return `"${ this.valueOf() }"`;
}
}
class ToJSONObject extends Object {
type() {
return 'ToJSONObject';
}
toString() {
let ret = [];
let keys = Object.keys(this);
for (let i = 0, len = keys.length; i < len; i++) {
ret.push(`"${ keys[ i ]}":${ this[ keys[ i ] ] }`);
}
return `{${ret.join( ',' )}}`;
}
}
class ToJSONArray extends Array {
type() {
return 'ToJSONArray';
}
toString() {
return `[${this.join( ',' )}]`;
}
}
function isPrimaryType(value) {
let type = typeof value;
return type === 'number' ||
type === 'string' ||
type === 'boolean';
}
function isFunction(value) {
return typeof value === 'function';
}
function gettype(value) {
if (isPrimaryType(value)) {
return typeof value;
}
if (isFunction(value)) {
return 'Function';
}
if (value.type && typeof value.type === 'function') {
return value.type();
}
// [object Object]
return Object.prototype.toString.call(value).slice(8).slice(0, -1);
}
/**
* 这里只考虑基本类型, 数组, 和 Object 类型.
* @param {any} target 数据
*/
function create(target) {
if (isPrimaryType(target)) {
return [gettype(target) === 'string' ? new ToJSONString(target) : target, true];
}
if (gettype(target) === 'Object') {
return [new ToJSONObject(), false];
}
if (gettype(target) === 'Array') {
return [new ToJSONArray(), false];
}
return [null, true];
}
function trace(target) {
let [o, isPrimary] = create(target);
if (!isPrimary) {
let t = gettype(o);
switch (t) {
case 'ToJSONObject': {
let keys = Object.keys(target);
for (let i = 0, len = keys.length; i < len; i++) {
o[keys[i]] = trace(target[keys[i]]);
}
}
break;
case 'ToJSONArray': {
for (let i = 0, len = target.length; i < len; i++) {
o[i] = trace(target[i]);
}
}
break;
}
}
return o;
}
function toJSON(target) {
return trace(target).toString();
}
let o = {
name: "jim",
arr: [1, 2, 3, "4", '5'],
test1: 1,
test2: true,
test: {
name: 'jim',
age: 19,
gender: true
}
};
let res = toJSON(o)
console.log(res);