yes*_*esh 5 javascript object lodash
我有一个具有多个属性的对象,我想使用lodash删除空的对象/嵌套对象.做这个的最好方式是什么?
Let template = {
node: "test",
representation: {
range: { }
},
transmit: {
timeMs: 0
}
};
Run Code Online (Sandbox Code Playgroud)
至
template = {
node: "test",
transmit: {
timeMs: 0
}
};
Run Code Online (Sandbox Code Playgroud)
我试过这样的事,但我迷路了.
Utils.removeEmptyObjects = function(obj) {
return _.transform(obj, function(o, v, k) {
if (typeof v === 'object') {
o[k] = _.removeEmptyObjects(v);
} else if (!_.isEmpty(v)) {
o[k] = v;
}
});
};
_.mixin({
'removeEmptyObjects': Utils.removeEmptyObjects
});
Run Code Online (Sandbox Code Playgroud)
从没有嵌套对象的对象中删除未定义、null 和空字符串
_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');
Run Code Online (Sandbox Code Playgroud)
对于嵌套对象,您可以创建一个递归函数来执行此操作
它将删除任何级别的空对象、空数组、null、未定义、空字符串......
removeEmpty(obj) {
let finalObj = {};
Object.keys(obj).forEach((key) => {
if (obj[key] && typeof obj[key] === 'object') {
const nestedObj = removeEmpty(obj[key]);
if (Object.keys(nestedObj).length) {
finalObj[key] = nestedObj;
}
} else if (obj[key] !== '' && obj[key] !== undefined && obj[key] !== null) {
finalObj[key] = obj[key];
}
});
return finalObj;
}
Run Code Online (Sandbox Code Playgroud)
更新 11-4-2022
根据@RahulSoni 评论,我刚刚修复了数组到对象的转换。现在一切都该处理了。如果您还有其他意见,请告诉我
removeEmpty(obj) {
const finalObj = {};
Object.keys(obj).forEach((key) => {
if (obj[key] && typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
const nestedObj = this.removeEmpty(obj[key]);
if (Object.keys(nestedObj).length) {
finalObj[key] = nestedObj;
}
} else if (Array.isArray(obj[key])) {
if (obj[key].length) {
obj[key].forEach((x) => {
const nestedObj = this.removeEmpty(x);
if (Object.keys(nestedObj).length) {
finalObj[key] = finalObj[key] ? [...finalObj[key], nestedObj] : [nestedObj];
}
});
}
} else if (obj[key] !== '' && obj[key] !== undefined && obj[key] !== null) {
finalObj[key] = obj[key];
}
});
return finalObj;
}
Run Code Online (Sandbox Code Playgroud)
例子:
const obj = {
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
array: [
{
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
obj: {
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
},
},
{
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
obj: {
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
},
},
],
b: {
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
c: {
a: '',
aa: null,
aaa: undefined,
aaaa: 'aaaa',
aaaaa: 0,
aaaaaa: 1,
aaaaaaa: 2,
aaaaaaaa: true,
aaaaaaaaa: false,
emptyObj: {},
emptyArray: [],
},
},
};
const finalObj = removeEmpty(obj);
console.log('finalObj After remove', finalObj);
Run Code Online (Sandbox Code Playgroud)
您可以通过几个步骤实现此目的:
使用pickBy()使用isObject()谓词选择对象键值.
使用mapValues()以递归方式调用removeEmptyObjects(),请注意它只会使用对象调用此函数.
function removeEmptyObjects(obj) {
return _(obj)
.pickBy(_.isObject) // pick objects only
.mapValues(removeEmptyObjects) // call only for object values
.omitBy(_.isEmpty) // remove all empty objects
.assign(_.omitBy(obj, _.isObject)) // assign back primitive values
.value();
}
Run Code Online (Sandbox Code Playgroud)
function removeEmptyObjects(obj) {
return _(obj)
.pickBy(_.isObject)
.mapValues(removeEmptyObjects)
.omitBy(_.isEmpty)
.assign(_.omitBy(obj, _.isObject))
.value();
}
_.mixin({
removeEmptyObjects: removeEmptyObjects
});
var template = {
node: "test",
representation: {
range: {}
},
transmit: {
timeMs: 0
}
};
var result = _.removeEmptyObjects(template);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>Run Code Online (Sandbox Code Playgroud)