关于处理对象中 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)
阅读 3.8k
2 个回答

可以用正则的方式替换

JSON.stringify([{name: null,age:{max: null,min:12}}]).replace(/"[a-zA-Z0-9_]{1,}":\s{0,}null/g, match => match.replace('null', 'targetStr'))
var mt = {}
mt.removeNull = (item, newValue) => {
    for (var n in item) {
        var value = item[n]
        // 如果 item 为 object 递归循环后覆盖原来的值
        // 如果 item 为值的情况下直接设置为 newValue
        if (typeof value === 'object' && value !== null) {
            item[n] = mt.removeNull(value,newValue)
        } else {
            item[n] = value || newValue
        }
    }
    return item
}

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题