首页 > 解决方案 > 从数组中删除空属性

问题描述

有人可以在这里帮忙吗:

  1. 很好地处理对象
  2. 但是代码在空数组中中断
const removeEmptyProperties = (obj) => {
  obj = Array.isArray(obj) ? obj.filter(val => val !== 'null' || val !== 'undefined') : obj;
  Object.keys(obj).forEach((key) => {
    //recursive for nested objects
    if (obj[key] && typeof obj[key] === 'object')
      removeEmptyProperties(obj[key]);
    //remove empty properties
    else if (
      typeof obj[key] !== 'boolean' &&
      (obj[key] == null || obj[key] == '')
    )
      delete obj[key];
    //remove empty objects
    if (
      typeof obj[key] !== 'boolean' &&
      typeof obj[key] === 'object' &&
      Object.keys(obj[key]).length == 0
    )
      delete obj[key];
  });
};
let data = {
  questionDetails: [
    {
      trees: 123,
      template: {
        id : null
      }
    },
    {
      trees: 123,
    },
  ],
};
delete data.questionDetails[1];
removeEmptyProperties(data);
console.log(data); => { questionDetails: [ { trees: 123 }, <1 empty item> ] }

但预期结果应该是 { questionDetails: [ { trees: 123 } ] },我的代码在空数组中中断

标签: javascriptobject

解决方案


您可以采取一种方法,该函数为调用范围返回一个布尔值以删除属性或元素。

  1. 检查是否value的或不是一个对象。

    • true如果value是不需要的值,则返回false每个其他值。
  2. 检查是否value是一个数组。

    • 从末尾迭代数组,因为Array#slice更改具有更大索引的元素的索引。较小的索引不受影响。
    • 使用元素调用函数removeEmptyPropertiessplice如果必须删除元素。
    • 返回true一个空数组。
  3. 最后你得到了一个对象。

    • 获取密钥并对其进行迭代。
    • 使用值调用函数removeEmptyProperties并删除属性,如果true.
    • 返回true没有自己属性的对象。

最后,所有空数组/对象和不需要的属性都被删除。

const
    removeEmptyProperties = value => {
        if (!value || typeof value !== 'object') {
            return [undefined, null, ''].includes(value);
        }
        if (Array.isArray(value)) {
            let i = value.length;
            while (i--) if (removeEmptyProperties(value[i])) value.splice(i, 1);
            return !value.length;
        }
        Object.keys(value).forEach(k => {
            if (removeEmptyProperties(value[k])) delete value[k];
        });
        return !Object.keys(value).length;
    };

let data = { questionDetails: [{}, { id: null, foo: 0, bar: undefined }] };

removeEmptyProperties(data);
console.log(data);

data.questionDetails[0].foo = '';
removeEmptyProperties(data);
console.log(data);


推荐阅读