存储与运行JavaScript函数

一、背景介绍

如上图所示,有一个列表设置按钮,点击弹窗,可以对列表的表头顺序等进行设置,点击保存后则将最新的列表转化为字符串传给后端,以下代码则是表头的部分,在进入页面的时候发起请求得到传入的那个字符串,在将其转化为数组,进行列表的渲染。

yaml 复制代码
[
  {  prop: 'suggestState', label: '评估状态', width: 130,  isEditItem: true, controlType: 'select', showBatch: true, options: [ { value: 1, label: '已评估' }, { value: 0, label: '未评估' } ], formatter: row => row.suggestState === 1 ? '已评估' : '未评估', whetherIcon: false, },
  {  prop: 'suggest', label: '评估意见', minWidth: 150, isEditItem: true, controlType: 'input' },
]

二、问题来了

基于以上背景我们会发现,在我们的表头数组中会存在formatter对应的函数,可是当我们使用JSON.stringify来转化数组的时候遇到函数则会被忽略或者为null那么我们该如何实现将JavaScript中的函数转化为字符串并且存储到服务器上有必要时,获取然后再转化回来进行使用呢

三、解决思路

既然直接使用JSON.stringify会忽略函数,我们可以采用toString将函数转化为字符串,因为这个可以梳理思路:

  1. 先将对象中的函数进行toString操作,formatter: (function rowSet(){ return row.suggestState === 1 ? '已评估' : '未评估'}).toString()
  2. 再使用JSON.stringify把数组转化为字符串,这样就实现了将完整的数据保存到服务器上
  3. 接下来就是从服务器上将字符串拿出来了,通过使用JSON.parse来解析之前的字符串得到的数组,但是formatter后对应的是"function rowSet (row) {\n return row.suggestState === 1 ? '已评估' : '未评估';\n }"字符串了,不是函数了,
  4. 接下来我们将要对这个字符串函数进行转化,由于是数组,我们就得去确定是哪些元素是具有函数的因此可以封装如下函数:
javascript 复制代码
function restoreFunctionsInArray(arr) {
    return arr.map(obj => {
        for (const key in obj) { 
            if (typeof obj[key] === 'string' && obj[key].includes('function')) { 
                obj[key] = new Function('return ' + obj[key])();
            } 
        }
        return obj; 
    });
 }

这种写法仅限于你声明函数的方式是函数式声明,也就是function加函数名的方式声明的函数,代码的大致含义就是,但检查到数组的某个元素的某个键值对的值是字符串,并且字符串含有function字段,则采用 new Function 的方式将那个字符串传入其中并且通过return的方式确保这个字符串可以有一个返回值,这样就将刚才是字符串的函数替换成了函数。

四、使用封装的类库

一个问题的产生,如果背后是一个工程化问题的话,一般情况下你都能够找到对应的通用解决方案,因此也找到了一个解决方案, xijs 由于本人没有使用过,因此此方案请自行尝试,如有问题自行负责。

相关推荐
GISer_Jing10 小时前
AI编程革命:Trae如何重塑前端开发
前端·前端框架·aigc·ai编程
豌豆学姐10 小时前
Sora2 视频生成 API 如何对接?附可直接使用的开源前端项目
前端·人工智能·开源·aigc·php
cz追天之路10 小时前
华为机考 ------ 计算某字符出现次数
前端·javascript·华为机考
毕设源码-朱学姐10 小时前
【开题答辩全过程】以 基于Web酒店管理的设计与实现为例,包含答辩的问题和答案
前端
talenteddriver11 小时前
Java Web:http请求在springboot项目中的传递层级(自用笔记)
java·前端·spring boot·http
咘噜biu11 小时前
Java后端和前端的接口数据加密方案(椭圆曲线集成加密方案)
java·前端·安全·aes·密钥协商ecdh·椭圆曲线集成加密方案
CodeSheep11 小时前
百度又一知名产品,倒下了!
前端·后端·程序员
阿芯爱编程11 小时前
前端面试题linux操作
前端·面试
Bug.ink11 小时前
BUUCTF——WEB(4)
前端·网络安全·靶场·ctf·buuctf
L Jiawen11 小时前
【Web】RESTful风格
前端·后端·restful