javascript - 递归地从对象中删除空键/值对的最佳方法

标签 javascript recursion

假设我有当前的数据对象:

const human = {
  name: '',
  age: 0,
  head: {
    rightEye: '',
    leftEye: '',
  }
  limbs: {
    arms: '',
    legs: '',
  }
  somethingElse: '',
}

我想删除所有空的键/值对。这部分我通过以下代码得到了它:

const removeFalsy = (obj) => {
  const newObj = {};
  Object.keys(obj).forEach((prop) => {
    if (obj[prop]) {
      if (typeof obj[prop] === 'object') {
        newObj[prop] = removeFalsy(obj[prop]);
      } else {
        newObj[prop] = obj[prop];
      }
    }
  });
  return newObj;
};

问题是空对象仍然保留在主对象中。我想从主对象内部删除每个空对象以获得以下结果:

const human = {};

代替我当前的结果:

const human = {
  head: {},
  limbs: {},
}

我最好的选择是什么?

最佳答案

当递归调用removeFalsy时,如果递归调用的结果有一个至少有一个键的对象,则仅分配给newObj:

const removeFalsy = (obj) => {
  const newObj = {};
  Object.keys(obj).forEach((prop) => {
    if (obj[prop]) {
      if (typeof obj[prop] === 'object') {

        // change below:
        const nonFalseyVal = removeFalsy(obj[prop]);
        if (Object.keys(nonFalseyVal).length !== 0) {
          newObj[prop] = nonFalseyVal;
        }
        // change above

      } else {
        newObj[prop] = obj[prop];
      }
    }
  });
  return newObj;
};

const human = {
  name: '',
  age: 0,
  head: {
    rightEye: '',
    leftEye: '',
  },
  limbs: {
    arms: '',
    legs: '',
  },
  somethingElse: '',
}
const nonFalsyHuman = removeFalsy(human);
console.log(nonFalsyHuman);

请注意,使用.reduce可能更合适,并且您可以使用Object.entries来获取键值立即地:

const removeFalsy = (obj) => {
  return Object.entries(obj).reduce((a, [key, val]) => {
    if (!val) return a;
    if (typeof val === 'object') {
      const nonFalseyVal = removeFalsy(val);
      if (Object.keys(nonFalseyVal).length !== 0) {
        a[key] = nonFalseyVal;
      }
    } else {
      a[key] = obj[key];
    }
    return a;
  }, {});
};

const human = {
  name: '',
  age: 0,
  head: {
    rightEye: '',
    leftEye: '',
  },
  limbs: {
    arms: '',
    legs: '',
  },
  somethingElse: '',
}
const nonFalsyHuman = removeFalsy(human);
console.log(nonFalsyHuman);

关于javascript - 递归地从对象中删除空键/值对的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776863/

相关文章:

c++ - 递归函数理解

javascript - vue与php交互

javascript - 使用 JavaScript 递归计算字符串中的元音

javascript - 从 jquery 的 var 中删除一些文本

javascript - 360 度 Canvas 弧中的缺口

python - 反转未知深度的嵌套字典

sql - PostgreSQL 递归与

javascript - JavaScript 递归函数问题

javascript - jQuery 滚动力不会滚动超过 450px

javascript - jquery数据从字符串到数组