学习前端第三十一天(JSON方法,toJSON;递归)

一、JSON方法

1.将对象转换为字符串

JavaScript 提供了如下方法:

  • JSON.stringify 将对象转换为 JSON,得到的json字符串是一个被称为 JSON 编码 或 字符串化(stringified) 的对象
  • JSON.parse 将 JSON 转换回对象。

字符串使用双引号。JSON 中没有单引号或反引号。

对象属性名称也是双引号的。这是强制性的。所以 age:20 被转换成 "age":20。

下面的会被json方法跳过:函数属性(方法)。Symbol 类型的键和值。存储 undefined 的属性。

javascript 复制代码
        const obj = { name: "jack", age: 20, gender: "male", [Symbol("id")]: "xc", }
        console.log(JSON.stringify(obj));//{"name":"jack","age":20,"gender":"male"}
        console.log(typeof JSON.stringify(obj));//string
        const arr = [1, 2, 3, 4, 5, undefined, function xc() { }, [Symbol("id")],]
        console.log(JSON.stringify(arr));//[1,2,3,4,5,null,null,[null]]

        console.log(JSON.stringify(true));//true
        console.log(JSON.stringify(false));//false

2.排除和转换,replacer

JSON``.``stringify``(value[``,replacer, space]``)

传递一个属性数组给它,那么只有这些属性会被编码。

3.格式化,space

JSON``.``stringify``(value[``, replacer, space ]``)

告诉 JavaScript 在多行中显示嵌套的对象,对象内部缩进 n个空格

4.解码 JSON 字符串,JSON.parse

let value = JSON``.``parse``(str, [reviver]``)``;

javascript 复制代码
// 字符串化数组
let numbers = "[0, 1, 2, 3]";

numbers = JSON.parse(numbers);

alert( numbers[1] ); // 1

str

要解析的 JSON 字符串。

reviver

可选的函数 function(key,value),该函数将为每个 (key, value) 对调用,并可以对值进行转换。

javascript 复制代码
        const obj =
            `
            [
              {
            "name": "jack",
            "age": 20,
            "gender": "male",
            "birth": "2002-02-16"
             } ,
             {
            "name": "jack",
            "age": 20,
            "gender": "male",
            "birth": "2002-02-16"
             } ,
             {
            "name": "jack",
            "age": 20,
            "gender": "male",
            "birth": "2002-02-16"
             }
            ]
             `;

        const r = JSON.parse(
            obj,
            function (k, v) {
                switch (true) {
                    case k === "age":
                        return v + "岁";
                    case k === "birth":
                        return (new Date(v)).toLocaleString();
                    default:
                        return v;
                }
            }
        );

        console.log(r);// [{...}, {...}, {...}]

二、递归

当一个函数解决一个任务时,在解决的过程中它可以调用很多其它函数。在部分情况下,函数会调用 自身 。这就是所谓的 递归

递归将函数调用简化为一个更简单的函数调用,然后再将其简化为一个更简单的函数,以此类推,直到结果变得显而易见。

javascript 复制代码
        //  递进加回归,50以内奇数相加
        function sum(n) {
            if (n === 0) return 0; // 有个确切的返回值
            return n + sum(n - 2) - 1;
        }
        console.log(sum(50));

递归遍历:

javascript 复制代码
        //  递归遍历
        const num = [1, 2, ["a", "b", 3, 4, [5, 6]], 7, 8, 9]
        function mapNum(arr) {
            arr.forEach(element => {
                if (Array.isArray(element) === false) {
                    console.log(element)
                } else {
                    mapNum(element);
                }
            }
            );
        };
        mapNum(num); //1 2 a b 3 4 5 6 7 8 9

递归通用写法:

javascript 复制代码
        // 递归通用写法;90%
        const nums = [1, 2, [10, 20, [3, 4], 5, 6], 7, 8];

        function sum(arr, n = 0) {    // 定义一个函数中的中间变量,且不会被重置
            arr.forEach(element => {
                if (Array.isArray(element) === false) {
                    n += element;     // 加上第一次的数字类型
                } else {
                    n += sum(element, n);   // 遇到数组类型,用前面的和加上数组类型中的和,注意中间变量
                }
            });
            return n;
        }
        console.log(sum(nums));
相关推荐
zyf1044166 分钟前
暑期实践日志 Day44:梳理剪辑实践成果,进行学习总结
学习·计算机网络·剪辑·暑期实践·课题任务
ouynagda6 分钟前
Linux Socket 网络编程学习笔记
linux·网络·学习
我爱cope15 分钟前
【计算机网络 | 网络层12:SDN:控制平面与数据平面分离意味着什么?】
网络·学习·计算机网络·平面
优化Henry26 分钟前
5G网络切片之S-NSSAIlist相关参数解析
运维·服务器·网络·笔记·学习·信息与通信
tju新生代魔迷34 分钟前
Verilog HDL学习笔记(六)| 第6章 数据流建模
笔记·学习
凯尔萨厮37 分钟前
Java学习笔记十二(异常与IO)
笔记·学习
冬夜戏雪1 小时前
学习日记-LRU缓存成员变量,入参day1
学习
Sunshing151 小时前
非自治连续系统稳定性定义与定理判据
笔记·学习
andrsted2 小时前
老师可以用小程序在线整理题库、课堂检测和错题集
学习·微信小程序·小程序·学习方法
zhangrelay3 小时前
手机-笔电-等数码产品-电池健康的一些数据-2026
笔记·学习·锂电池