删除对象中的空或未定义属性

Delete null or undefined attributes in object

我想创建一个方法来删除 null 和未定义的属性。

为此:

I convert my plain object into table

loop on it

filter on attributes if there are null or undefined

但问题是我并没有用新值来重组我的对象。让我们来看看:

var req = {
    adtForm1: {
      firstName: 'John',
      lastName: undefined,
      middleName: ''
    },
    adtForm2: {
      firstName: null,
      lastName: 'Doe',
      middleName: ''
    }
  };

  removeUndefinedFormsAttributes = (somesForms) => {
    const forms = Object.values(somesForms);
    const formsUpdate = {};
    forms.forEach(item => {
      const formFields = Object.values(item);
      formFieldsKeys = Object.keys(item);
      const formFiltered = formFields.filter(field => { return field !== null && field !== undefined; });
      console.log("formFiltered", formFiltered);
    })
    console.log(somesForms)
    return forms;
  };

removeUndefinedFormsAttributes(req)

正如我们在代码片段中看到的那样,formFiltered 更改了好的值,但我需要 return 与 somesForms 相同的对象。 这就是我需要的:

expectedValue = {
    adtForm1: {
        firstName: 'John',
        middleName: ''
    },
    adtForm2: {
        lastName: 'Doe',
        middleName: ''
    }
}

我知道我需要使用 reduce() 函数和 keys() 函数,但我真的不知道如何使用。我将非常感谢任何帮助。

据我了解,您需要修改实际对象而不是创建新结构。如果是这样,那么您不想要 .reduce()。您只需要一个修改给定对象的递归函数。

var req = {
  adtForm1: {
    firstName: 'John',
    lastName: undefined,
    middleName: ''
  },
  adtForm2: {
    firstName: null,
    lastName: 'Doe',
    middleName: ''
  }
};

function removeUndefinedFormsAttributes(obj) {
  Object.entries(obj)
    .forEach(([k, v]) => {
      if (v == null) {
        delete obj[k];
      } else if (typeof v === "object") {
        removeUndefinedFormsAttributes(v);
      }
    })
};

removeUndefinedFormsAttributes(req);

console.log(req);

这里我使用 Object.entries 来获取给定对象的 key/value 对。

如果 vnullundefined,它将 delete 来自对象的 k。如果 v 是一个对象,它会对该对象进行递归调用。

仅供参考,v == nullv === null || v === undefined

相同

您可以递归地迭代对象并创建一个没有 nullundefined 的新对象。使用 Object.entries() 从对象中获取键值对。用 Array.reduce 迭代这些对。如果值为 nullundefined 则跳过它的键。如果它是一个对象,则将对值调用 removeUndefinedFormsAttributes 的结果分配给键。如果它不是对象,只需将值分配给键即可。

const req = {"adtForm1":{"firstName":"John","middleName":""},"adtForm2":{"firstName":null,"lastName":"Doe","middleName":""}};

const removeUndefinedFormsAttributes = (obj) => 
  Object.entries(obj).reduce((r, [k, v]) => {
    if(v === null || v === undefined) return r;
    if(typeof v === 'object') r[k] = removeUndefinedFormsAttributes(v);
    else r[k] = v;
    
    return r;
  }, {});

const result = removeUndefinedFormsAttributes(req)

console.log(result)

如果您只需要从嵌套在下一层的对象中删除具有 nullundefined 值的键,那么您可以使用 Object.values 迭代主对象的值,然后使用 Object.keys 遍历每个嵌套对象的键,并删除符合条件的键。您可以测试嵌套对象的值以确定它们是 null 还是 undefined,例如 value == null(参见 How to determine if variable is undefined or null?)。

如果您需要删除对象中不同嵌套级别的键或某些嵌套值具有不同类型的对象中的键,请查看其他一些使用递归和类型检查的答案。

例如:

const req = { adtForm1: { firstName: 'John', lastName: undefined, middleName: '' }, adtForm2: { firstName: null, lastName: 'Doe', middleName: '' } };
Object.values(req).forEach((v) => {
  Object.keys(v).forEach((k) => {
    if (v[k] == null) {
      delete v[k];
    }
  });
});

console.log(req);
// {"adtForm1":{"firstName":"John","middleName":""},"adtForm2":{"lastName":"Doe","middleName":""}}

试试这个

  let removeNotNeedet = ( obj ) => {
    let newObj = {} 
    for (const key in obj) {
        if ( obj[key] !== null && obj[key] !== undefined ){
            newObj[key] = obj[key]
        }
    }
    return newObj
  }

如果这些属性不是 null 或 undefined,您可以简单地将它们克隆到一个新对象中。

非常简单的代码,通过 obj 递归循环并仅在属性有效时才插入它们:

function clearObject(object) {
    if (typeof(object) != "object") return false;

    const clean_object = {};

    for (let k in object) {
        let item = object[k];
        if (item === null || item === undefined) continue;
        clean_object[k] = clearObject(item) || item;
    }

    return clean_object;
}