前言
几个月前碰到这个面试题,当时emm没解出来,最近有空自己试着实现了一下;(主要是百度了好久,看别人的题解要么太复杂不可以,要么随便试试就发现实现不完整),so自己动手丰衣足食
实现
思路:
- 判断字符类型,简单类型赋值
- 便利对象,拼接字符串,需要注意‘逗号’以及一些特殊值的处理
- key用双引号封装,value判断是否还有子集有同样再封装,字符串用
实现:
- 实现基本类型的处理包括 “number”, “string”, “undefined”, “null”, “boolean”
- 实现复杂类型的处理包括 “function”, “array”, “object”
特殊处理:
- 类型是function 解析为 undefined
- 数组遇到undefined和function类型的解析为null,
- 对象遇到vaule值是undefined或者类型是functioned,则不解析这一对key-value值
代码实现
let str = ""; // 注意每次调用都需要置空,应为这是个全局变量,会无限叠加滴~,后续再看看怎么去解决
function objToStr(obj) {
let simple = "";
/*简单值处理
param :需要转化的值
type:转化值的类型
*/
function baseFunction(param, type = "base") {
if (typeof param === "undefined") {
simple = type === "arr" ? null : undefined;
} else if (typeof param === "number") {
simple = param;
} else if (typeof param === "string") {
simple = `"${param}"`;
} else if (typeof param === "function") {
simple = type === "arr" ? null : `undefined`;
} else if (typeof param === "boolean") {
simple = `'${param}'`;
}
return simple;
}
const type = ["number", "string", "undefined", "function", "boolean"];
if (type.includes(typeof obj)) {
baseFunction(obj);
} else if (typeof obj === "object") {
if (obj === null) {
str += null;
} else if (Array.isArray(obj)) {
str += `[`;
for (let i in obj) {
if (typeof obj[i] === "object") {
objToStr(obj[i]);
} else {
str += baseFunction(obj[i], "arr");
}
// 处理逗号
i < obj.length - 1 && (str += `,`);
}
str += `]`;
} else {
str += `{`;
for (let i in obj) {
if (typeof obj[i] === "object") {
str += `"${i}":`;
objToStr(obj[i]);
} else {
obj[i] !== undefined &&
typeof obj[i] !== "function" &&
(str += `"${i}":${baseFunction(obj[i], "obj")}`);
}
// 处理逗号
let arr = Object.keys(obj);
i !== arr[arr.length - 1] &&
obj[i] !== undefined &&
typeof obj[i] !== "function" &&
(str += `,`);
}
str += `}`;
}
}
return str || simple;
}
// objToStr(["aa",{aa:function(){console.log(1)},bb:1}]);
objToStr(["aa",function () {console.log(1);},{ bb: 1 },]);
// objToStr(undefined);
其他
有更简单易懂的实现方法的友友们麻烦评论分享呀~