import { FieldType } from "./constant";
import { Point } from "./geo/point";
import { ServerDate } from "./serverDate";
interface DocumentModel {
_id: string;
}
/**
* 工具模块
*
* @author haroldhu
*/
export class Util {
/**
* 格式化后端返回的文档数据
*
* @param document - 后端文档数据
*/
public static formatResDocumentData = (documents: DocumentModel[]) => {
return documents.map(document => {
return Util.formatField(document);
});
};
/**
* 格式化字段
*
* 主要是递归数组和对象,把地理位置和日期时间转换为js对象。
*
* @param document
* @internal
*/
private static formatField = document => {
const keys = Object.keys(document);
let protoField = {};
// 数组递归的情况
if (Array.isArray(document)) {
protoField = [];
}
keys.forEach(key => {
const item = document[key];
const type = Util.whichType(item);
// console.log(type, item)
let realValue;
switch (type) {
case FieldType.GeoPoint:
realValue = new Point(item.coordinates[0], item.coordinates[1]);
break;
case FieldType.Timestamp:
realValue = new Date(item.$date);
break;
case FieldType.Object:
case FieldType.Array:
realValue = Util.formatField(item);
break;
case FieldType.ServerDate:
realValue = new Date(item.$date);
break;
default:
realValue = item;
}
if (Array.isArray(protoField)) {
protoField.push(realValue);
} else {
protoField[key] = realValue;
}
});
return protoField;
};
/**
* 查看数据类型
*
* @param obj
*/
public static whichType = (obj: any): String => {
let type = Object.prototype.toString.call(obj).slice(8, -1);
if (type === FieldType.Object) {
// console.log(obj)
Iif (obj instanceof Point) {
return FieldType.GeoPoint;
} else Iif (obj instanceof Date) {
return FieldType.Timestamp;
}/* else if (obj instanceof Command) {
return FieldType.Command;
} */else Iif (obj instanceof ServerDate) {
return FieldType.ServerDate
}
Iif (obj.$timestamp) {
type = FieldType.Timestamp;
} else if (obj.$date) {
type = FieldType.ServerDate;
} else if (Array.isArray(obj.coordinates) && obj.type === "Point") {
type = FieldType.GeoPoint;
}
}
return type;
};
/**
* 生成文档ID
*
* 为创建新文档使用
*/
public static generateDocId = () => {
let chars = "ABCDEFabcdef0123456789";
let autoId = "";
for (let i = 0; i < 24; i++) {
autoId += chars.charAt(Math.floor(Math.random() * chars.length));
}
return autoId;
};
}
|