我想要创建一个删除空属性和未定义属性的方法。
要做到这一点:
我把普通的对象转换成表 在上面循环 如果存在空或未定义的属性,则对属性进行筛选。
但问题是,我并不是来用新的价值观来重构我的目标。让我们来看看:
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相同的对象。这就是我需要的:
expectedValue = {
adtForm1: {
firstName: 'John',
middleName: ''
},
adtForm2: {
lastName: 'Doe',
middleName: ''
}
}我知道我需要使用减()函数和key()函数,但实际上我不知道如何使用。我真的很感激你的帮助。
发布于 2019-04-04 16:48:49
您可以递归地迭代对象并创建一个新对象,而不需要null或undefined。使用Object.entries()从对象获取键和值对。用Array.reduce迭代这些对。Ff值是null或undefined,跳过它的键。如果它是一个对象,则将对值调用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)
发布于 2019-04-04 16:49:56
如果只需要从嵌套一个级别的对象中删除带有null或undefined值的键,则可以使用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":""}}
发布于 2019-04-04 16:46:50
如果我理解,您需要修改实际的对象,而不是创建一个新的结构。如果是这样,那么您就不需要.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获取给定对象的键/值对。
如果v是null或undefined,它将从对象中提取该k。如果v是一个对象,它将对该对象进行递归调用。
FYI,做v == null和做v === null || v === undefined一样
https://stackoverflow.com/questions/55520988
复制相似问题