我想创建一个删除null和undefined属性的方法。
要做到这一点 :
我将普通对象转换为表格
循环就可以了
如果存在null或未定义,则过滤属性
但问题是我没有到达用新值重构我的对象。让我们来看看 :
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: ''
}
}
我知道我需要使用reduce()函数和keys()函数,但我真的不知道如何。我真的很感激任何帮助。
您可以递归迭代对象并创建一个没有null
或undefined
的新对象。使用Object.entries()
从对象中获取键和值对。用Array.reduce
迭代对。如果值是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)
如果你只需要从嵌套了一级的对象中删除null
或undefined
值的键,那么你可以使用Object.values
迭代主对象的值,然后使用Object.keys
迭代每个嵌套对象的键,并删除那些匹配的你的条件。您可以测试嵌套对象的值,以确定它们是null
还是undefined
,如value == null
(请参阅How to determine if variable is undefined or null?)。
如果需要在对象中的某些嵌套级别或某些嵌套值具有不同类型的对象中删除键,请查看使用递归和类型检查的其他一些答案。
例如:
var 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":""}}
如果我理解,您需要修改实际对象而不是创建新结构。如果是这样,那么你不需要.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
,它将delete
k
从对象。如果v
是一个对象,它会使用该对象进行递归调用。
仅供参考,做v == null
和做v === null || v === undefined
一样
试试这个吧
let removeNotNeedet = ( obj ) => {
let newObj = {}
for (const key in obj) {
if ( obj[key] !== null && obj[key] !== undefined ){
newObj[key] = obj[key]
}
}
return newObj
}
如果它们不为null或未定义,您可以简单地将这些属性克隆到新对象中。
相当简单的代码,通过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;
}