考虑这样的javascript对象:
const fooObject = {
firstName: 'John',
lastName: null,
age: 43,
address: {
city: null,
country: null
}
}
我通常使用函数omitBy
来删除未设置的字段omitBy(fooObject, isNil)
,但不适用于上述fooObject
这样的对象。有一些不错的方法如何用lodash或vanilla js删除给定对象上的嵌套空对象和字段?
我对fooObject
对象的预期结果是:
{
firstName: 'John',
age: 43
}
如果该地址将至少包含一个填充的城市,则结果应为:
{
firstName: 'John',
age: 43,
address: {
city: 'Los Angeles',
}
}
答案 0 :(得分:0)
您需要使用一个递归函数,该函数将删除所有null
值,如果它具有一个对象或数组的值,则需要清除它,依此类推。如果清理的对象/数组为空,则可以跳过。
使用lodash时,您可以使用_.transform()
来处理数组和对象。
const deepClean = obj => _.transform(obj, (acc, value, key) => {
if(_.isNull(value)) return; // ignore null values
if (_.isObject(value)) { // handle objects / arrays
const cleanObj = deepClean(value) // clean the object
if(!_.isEmpty(cleanObj)) acc[key] = cleanObj // if it's not empty assign it to current key
} else { // handle primitives
acc[key] = value // assign value to current key
}
})
console.log(deepClean(fooObject = {
firstName: 'John',
lastName: null,
age: 43,
address: {
city: null,
country: null
}
}))
console.log(deepClean(fooObject = {
firstName: 'John',
lastName: null,
age: 43,
address: {
city: null,
country: 'Spain',
}
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
答案 1 :(得分:0)
您可以使用reduce
方法创建递归函数,该方法将遍历对象的多个级别并创建没有任何空值的新对象。
const a = {"firstName":"John","lastName":null,"age":43,"address":{"city":null,"country":null}}
const b = {"firstName":"John","lastName":null,"age":43,"address":{"city":null,"country":null, random: { foo: null, baz: 1}}}
function removeNulls(data) {
return Object.entries(data)
.reduce((r, [k, v]) => {
if (v !== null) {
if (typeof v === 'object') {
const child = removeNulls(v);
if (Object.keys(child).length) {
r[k] = child
}
} else {
r[k] = v;
}
}
return r;
}, {})
}
console.log(removeNulls(a))
console.log(removeNulls(b))