• 还原数组


    const parser = require("@babel/parser");
    const traverse = require("@babel/traverse").default;
    
    // 将js代码转换成AST
    // const { parse } = require("@babel/parser");
    // 用来遍历AST中的节点
    // const traverse = require("@babel/traverse").default;
    // AST转换成js
    const generator = require("@babel/generator").default;
    // 用来判断节点类型和生成新的节点
    const types = require("@babel/types");
    
    
    const jscode = `
    
    var a = [1,2,3,[1213,234],{"code":"666"},window];
    b = a[1] + a[2] + a[3];
    c = a[4];
    d = a[5];
    
    `;
    let ast = parser.parse(jscode);
    
    
    
    const replaceArrayElements =
    {//数组还原
        VariableDeclarator(path) {
            let { node, scope } = path;
            let { id, init } = node;
            if (!types.isArrayExpression(init)) return;
    
            const binding = scope.getBinding(id.name);
            if (!binding || !binding.constant) {
                return;
            }
    
            for (let referPath of binding.referencePaths) {
                let { node, parent } = referPath;
                if (!types.isMemberExpression(parent, { object: node }) || !types.isNumericLiteral(parent.property)) {
                    return;
                };
            }
    
            for (let referPath of binding.referencePaths) {
                let { parent, parentPath } = referPath;
                let index = parent.property.value;
                parentPath.replaceWith(init.elements[index]);
            }
            path.remove();
        },
    }
    
    traverse(ast, replaceArrayElements);
    
    
    let { code } = generator(ast);
    
    console.log(code);
  • 相关阅读:
    C基础-2 数组指针测试
    C基础-2 指针数组测试
    cesium + mapbox 的三种方式
    Fiddler 拦截 https 请求
    Fiddler 拦截请求修改数据
    开窗函数 SUM() OVER()
    ASP.NET中GridView和Repeater重复数据如何合并
    SQL Server 索引优化 ——索引缺失
    C# LINQ和Lambda表达式详解
    html+js实现登录的账号密码保存
  • 原文地址:https://www.cnblogs.com/angdh/p/15757916.html
Copyright © 2020-2023  润新知