JavaScript递归

69 阅读1分钟

老样子直接上代码

// 一个可能有很多无用字段的object
const obj = {
  name: 'zhayuechao',
  age: 28,
  v: null,
  childen: {
    name: 'ss',
    age: ' ',
  },
  list: [
    {
      from: 'hefei',
      code: null,
    },
    {
      from: 'luan',
      code: [
        {
          n: 1,
          m: null,
        },
      ],
    },
  ],
  others: ' ',
  address: '',
};

fn(obj);

function fn(obj) {
  // 如果使用注释掉的那种方法这里可以不用Object.keys()下面也不用forEach直接for..in即可
  const keys = Object.keys(obj);

  keys.forEach(k => {
    if (obj[k] == null || String(obj[k]).trim() == '') delete obj[k];
    else if (typeof obj[k] == 'object') fn(obj[k]);

    /* if(Array.prototype.isPrototypeOf(obj[k])) obj[k].forEach(sk => fn(sk));
    else if(typeof obj[k] == 'object') fn(obj[k]); */
  });
};
console.log(obj)

注释掉的for..in写法:

function fn(obj) {
  for (const k in obj) {
    if (obj[k] == null || String(obj[k]).trim() == '') delete obj[k];
    else if(Array.prototype.isPrototypeOf(obj[k])) obj[k].forEach(sk => fn(sk));
    else if(typeof obj[k] == 'object') fn(obj[k]);
  }
};

利用JSON处理(和自己写递归没啥大关系了)

console.log(
  JSON.parse(
    JSON.stringify(
      // 需要序列化的对象
      obj,
      // 序列化时的钩子
      (key, value) => {
        // 当值本身为假或者转换为字符串去除空格后为假的值抛弃
        if (!value || !String(value).trim()) return undefined;
        return value;
      }
    )
  )
);
// 本身已经是个JSON时
console.log(
  JSON.parse(
    JSON.stringify(obj),
    (key, value) => {
      // 也可以像上面一样判断但这里搞点不一样的扩展你的想象力
      if (value && String(value).trim()) return value;
      return undefined;
    }
  )
);