低代码导出前端代码遇到一些字符串和数据处理记录

文章介绍了在前端低代码导出代码功能中遇到的数据处理方法,包括删除JSON字符串中key或value的双引号,字符串转函数,两个对象数据的混合处理,深拷贝对象以及将字符串内容导出为代码文件的函数实现。
摘要由CSDN通过智能技术生成

概要

最近在做纯前端低代码导出代码功能,遇到的一些字符串和数据对象处理方法总结记录

1.删除对象转字符串所有key的双引号

 //str:JSON.stringify后的字符串
   function rmKeyDouquoMarks(str) {
      return str.replace(
        /("(\\[^]|[^\\"])*"(?!\s*:))|"((\\[^]|[^\\"])*)"(?=\s*:)/g,
        "$1$3"
      );
    }

2.删除对象转字符串某个key对应的value的双引号

删除第一个

   //key:值对应的key,str:JSON.stringify后的字符串
   function rmValueDouquoMarks(str, key ) {
      if (str.split(`${key}:"`).length > 1) {
        let newStr = '"' + str.split(`${key}:"`)[1];
        let target = newStr.substring(0, newStr.indexOf('"', 1) + 1);
        str =
          target.length > 2
            ? str.replace(target, target.substring(1, target.length - 1))
            : str;
      }
      return str;
    }

删除所有

//key:值对应的key,str:JSON.stringify后的字符串
function rmAllValDouquoMarks(str,key){
    while (str.includes( `${key}:"`)) {
        str = rmValueDouquoMarks(str, key);
      }
      return str;
}

3.字符串转函数

//str:字符串,that需要绑定的this
function strChangeToFun(str, that = null) {
  let fn = null;
  if (str && typeof str === "string") {
    try {
     let  func = new Function("return " + str);
      that && (func = func.bind(that))
      if (typeof func() === "function") {
        fn=func()
      }
    } catch (e) { }
  }
  return fn;
}

4.两个对象数据混合

解释:目标对象合并源对象生成新对象,目标对象优先级高于源对象,如果目标对象有值将取目标对象值否者取源对象值,数组类型强制覆盖或者子元素去重合并可选。有点类似vue mixins功能

/**
 * 
 * @param {*} obj 源对象
 * @param {*} target 目标对象
 * @param {*} arrAssginType 数组合并类型 0:强行target替换obj,1:子元素合并一起
 * @returns 
 */
const assginObject = function (obj, target, arrAssginType = 0) {
  const allKeys = function (obj, target) {
    let targetKeys = Object.keys(target);
    Object.keys(obj).forEach((key) => {
      if (!targetKeys.includes(key)) targetKeys.push(key);
    });
    return targetKeys;
  };

  const isNullOrUndefined = function (val) {
    return val === null || val === undefined;
  };

  if (Object.prototype.toString.call(obj) === "[object Object]") {
    let allKeysArr = allKeys(obj, target);
    let newObj = {};
    for (let key of allKeysArr) {
      if (Object.prototype.toString.call(obj[key]) === "[object Object]") {
        newObj[key] = assginObject(
          obj[key],
          (target && target[key]) || {}
        );
      } else if (obj[key] && Array.isArray(obj[key])) {
        newObj[key] = assginObject(
          obj[key],
          (target && target[key]) || []
        );
      } else {
        newObj[key] = !isNullOrUndefined(target[key]) ? target[key] : obj[key]

      }
    }
    return newObj;
  } else if (obj && Array.isArray(obj)) {
    return arrAssginType ?  [...new Set([...obj, ...target])]:[...target]
  } else {
    return isNullOrUndefined(target) ? obj : target;
  }
}

export default assginObject

5.数据对象深拷贝


//对象深度克隆
const deepClone = obj => {
    function isNullOrUndefined(val) {
        return val === null || val === undefined
    }
    if (Array.isArray(obj)) { //数组类型
        return obj.map(item => {
            return isNullOrUndefined(item) ? item : deepClone(item)//null和undefined无原型直接返回
        })

    } else if (Object.prototype.toString.call(obj) === '[object Object]') {//对象类型
        let newObj = {}
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                newObj[key] = isNullOrUndefined(obj[key]) ? obj[key] : deepClone(obj[key])
            }
        }
        return newObj

    }
    return obj.valueOf()//其他类型(基本类型或函数)
}
export default deepClone


6.字符串内容导出代码文件

   //字符串导出代码文件,content:字符串内容,filename文件名
   function exportLowCode(content, filename) {
      let elLink = document.createElement("a");
      elLink.download = filename;
      elLink.style.display = "none";
      let blob = new Blob([content]);
      elLink.href = URL.createObjectURL(blob);
      document.body.appendChild(elLink);
      elLink.click();
      document.body.removeChild(elLink);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值