首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除对象中的空属性或未定义属性

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

Stack Overflow用户
提问于 2019-04-04 16:33:44
回答 5查看 490关注 0票数 2

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

要做到这一点:

我把普通的对象转换成表 在上面循环 如果存在空或未定义的属性,则对属性进行筛选。

但问题是,我并不是来用新的价值观来重构我的目标。让我们来看看:

代码语言:javascript
运行
复制
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更改了好的值,但我需要返回与somesForms相同的对象。这就是我需要的:

代码语言:javascript
运行
复制
expectedValue = {
    adtForm1: {
        firstName: 'John',
        middleName: ''
    },
    adtForm2: {
        lastName: 'Doe',
        middleName: ''
    }
}

我知道我需要使用减()函数和key()函数,但实际上我不知道如何使用。我真的很感激你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-04-04 16:48:49

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

代码语言:javascript
运行
复制
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)

票数 2
EN

Stack Overflow用户

发布于 2019-04-04 16:49:56

如果只需要从嵌套一个级别的对象中删除带有nullundefined值的键,则可以使用Object.values迭代主对象的值,然后使用Object.keys迭代每个嵌套对象的键,并删除符合条件的键。您可以测试嵌套对象的值,以确定它们是null还是undefined,其内容类似于value == null (参见How to determine if variable is undefined or null?)。

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

例如:

代码语言:javascript
运行
复制
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":""}}

票数 3
EN

Stack Overflow用户

发布于 2019-04-04 16:46:50

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

代码语言:javascript
运行
复制
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获取给定对象的键/值对。

如果vnullundefined,它将从对象中提取该k。如果v是一个对象,它将对该对象进行递归调用。

FYI,做v == null和做v === null || v === undefined一样

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55520988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档