我有一个具有多个属性的对象,我想使用lodash删除空的对象/嵌套对象。这样做的最佳方式是什么?
Let template = {
node: "test",
representation: {
range: { }
},
transmit: {
timeMs: 0
}
};
到
template = {
node: "test",
transmit: {
timeMs: 0
}
};
我试过这样的事,但我输了。
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
});
答案 0 :(得分:6)
您可以通过以下几个步骤实现这一目标:
使用pickBy()使用isObject()谓词选择对象键值。
使用mapValues()递归调用removeEmptyObjects()
,请注意它只会使用对象调用此函数。
使用assign()分配对象中的所有原始值以进行分配,并使用omitBy()
谓词isObject()
分配。{/ p>
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();
}
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>');
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
&#13;
答案 1 :(得分:3)
更新:
从没有嵌套对象的对象中删除未定义、空和空字符串
target_redshift_config.json
对于嵌套对象,您可以创建一个递归函数来执行此操作
它将删除空对象、空数组、null、未定义、任何级别的空字符串...
_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');
示例:
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;
}
答案 2 :(得分:0)
这是我从对象中删除空值的方法
_.mapKeys(object, function (value, key) {
if (_.isEmpty(value)) delete object[key];
});
当对象值为空时,将使用键删除对象字段。
答案 3 :(得分:-1)
我正在为那些将来寻找解决此问题的方法的人进行更新。
lodash提供了一种更简单的方法。
_。compact(arrayName)将使用lodash从数组中删除所有空/未定义/空值
答案 4 :(得分:-2)
您可以使用_.pick
仅选择所需的属性,例如
var desiredTemplate = _.pick(template, ['node','transmit']);
否则,据我所知,lodash没有任何内置功能可以递归地从对象中删除空对象/数组。