Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
388 views
in Technique[技术] by (71.8m points)

关于处理对象中 value 为 null 值的函数问题

有这样一个需求就是 要把 数组或者object 中的 value 为 null 的值都替换成指定的字符串
比如说

let obj = {name:null,age:12}
处理之后就要变成 // {name:'',age:12}
可支持深度监听
let obj = [{name:null,age:{max:null,min:12}}]
处理之后就要变成 //[{name:'',age:{max:'',min:12}}]

我自己实现的方式如下,请各位大佬看下还有什么可以优化 或者 有漏洞需要改进的地方 请不吝指教!!!

    //工具函数
  function isObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]';
  }
  function isArray(arr) {
    return Object.prototype.toString.call(arr) === '[object Array]';
  }
  function isArrayOrObject(target){
    return isObject(target) || isArray(target)
  }
   /**
   * @desc 过滤数组或者对象中的 null 值
   * @param {Array|Object} target  -待替换的数组或者对象
   * @param {boolean} deep -是否深度递归
   * @param {any} filter -null被替换的变量字符串
   * @return target:any 被处理过的对象
   */
  function filterObjectNull(target, filter = '', deep = false) {
    const IS_ARRAY_OBJECT = isArrayOrObject(target);//判断是否是数组或者对象
    if(!IS_ARRAY_OBJECT) return target;
    //target 是数组遍历处理
    if ((target) instanceof Array) {
      return target.map(item => filterObjectNull(item, filter,deep))
    } 
    //target 是对象 直接处理
    if ((target) instanceof Object) {
      return Object.fromEntries(Object.entries(target).map(
        ([key,value]) => {
        //深度递归
        if (deep) {
          if (isArrayOrObject(value)) value = filterObjectNull(value, filter,deep)
        }
        return [key, value === null ? filter : value]
      }))
    }
  }
  //测试
let res = filterObjectNull({
    name: [{
      max: {
        age: {
          lin:{
            a:null
          }
        }
      }
    }],
    data: undefined
  },'',true)
  console.log(res)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

可以用正则的方式替换

JSON.stringify([{name: null,age:{max: null,min:12}}]).replace(/"[a-zA-Z0-9_]{1,}":s{0,}null/g, match => match.replace('null', 'targetStr'))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...