• js JSON.stringify() 的简单了解之函数的转换


    js JSON.stringify() 的简单了解之函数的转换

    在javaScript中 JSON.stringify()的作用就是将javaScript的值转换为JSON字符串。它一共有三个参数:
    value(必须) : 需要转换的javascript的值。
    replacer(可选): 可以为一个函数或者数组,如果为一个函数那么其每个成员就会执行这个函数,并返回这个函数的返回值而不是原始值。 如果函数返回undefined将排除成员。
    space(可选):用于为文本添加缩进,空格,换行等格式。
    下面是我实际遇到的问题:
    用vue3开发的项目管理系统,UI库用阿里的 Ant Design Vue,项目列表的字段是在太多需要动态展示,所以做了一个动态列的展示,后来又给加上了列排序筛选功能,但是表格配置的每一列筛选函数需要加在Columns中,
    像这样:
    注意sort函数:

     const tableColumns = ref([{
                title: "项目工号",
                dataIndex: "projectGonghao",
                key: "projectGonghao",
                slots: { customRender: "projectGonghao" },
                width: 120,
                ellipsis: true,
                align: 'center',
                fixed: 'left',
                ischeck: true,
                sorter: (a, b) => {
                    return adata.localeCompare(bdata)
                }
            },
            {
                title: "优先级",
                key: "priority",
                width: 150,
                slots: { customRender: "priority" },
                align: 'center',
                fixed: 'left',
                ischeck: true,
                sorter: function(a, b) {
                    return a.projectEntity.priority - b.projectEntity.priority
                }
            },
            ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    这个表格的列配置信息存在localStorage当中,每次保存的时候我需要将sorter函数先转为字符串,为什么要这样做?因为默认情况下JSON.stringify会忽略掉函数的;而到了在页面加载时又需要转为正常的函数的这一个过程。那么JSON.stringify() 的第二个参数就派上用场了可以传递一个函数进去:

    window.localStorage.setItem('tabColumn:' + currentUser.value.id, JSON.stringify(tabColumnList.value, (key, value) => {
                // 将函数转为字符串存储,由于JSON 不存函数会被忽略处理
                if (typeof value === 'function') {
                    return value.toString()
                }
                return value;
            }));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    到了需要使用的地方再转一下即可,在这里JSON.parse() 也可以有多个参数。
    text(必须): 要转换的javaScript 字符串。
    reviver(可选):一个函数,没个成员都调用次函数并返回。
    需要注意一点:eval("(" + value + ")")的使用,这样写才可以转为真正的函数。
    eval() 函数会将传入的字符串作为javascript代码来执行。

    const tableColumnsList = JSON.parse(window.localStorage.getItem('tabColumn:' + currentUser.value.id), (key, value) => {
                // 由于Json不存储函数 所以可以将函数先转为字符串存储,然后再将字符串转为函数使用
                if (key === 'sorter' || key === 'onFilter') {
                    return eval("(" + value + ")")
                }
                return value
            })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    SpringBoot整合阿里云OSS文件存储解决方案
    常见的几种身份验证方法
    小波神经网络的基本原理,小波神经网络设计方案
    黑马程序员前端实战项目---PC端品优购(下)
    MyBatis-Plus 框架 2022-8-2
    基于SSM+MySQL+Vue前后端分离的在线问卷调查系统
    SVN一直报错Error running context: 由于目标计算机积极拒绝,无法连接。解决办法【杭州多测师_王sir】...
    2023江苏师范大学计算机考研信息汇总
    chrome 外网很多网站提示验证错误进不去问题
    机械故障诊断信号幅域分析- 时域统计特征 | 基于python代码实现,在CWRU和IMF轴承数据及上实战
  • 原文地址:https://blog.csdn.net/weixin_46203213/article/details/127873059