我有一个具有多个属性的对象。我想删除任何具有虚假值的属性。
这可以通过compact
on数组来实现,但是对象呢?
我有一个具有多个属性的对象。我想删除任何具有虚假值的属性。
这可以通过compact
on数组来实现,但是对象呢?
Answers:
您可以制作自己的下划线插件(mixin):
_.mixin({
compactObject: function(o) {
_.each(o, function(v, k) {
if(!v) {
delete o[k];
}
});
return o;
}
});
然后将其用作本机下划线方法:
var o = _.compactObject({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
});
正如@AndreiNeculau 指出的那样,此混合会影响原始对象,而原始的compact
下划线方法将返回数组的副本。
为了解决此问题并使我们的compactObject
行为更像表弟,这是一个较小的更新:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
_.compact
。它将删除属性,而不是仅使用真实值创建浅表克隆。见下方stackoverflow.com/a/19750822/465684
delete
通常不建议使用,因为它会立即从原型链中公开具有相同名称的属性,并且由于“隐藏类”(V8)还会损害性能-更改对象结构会导致引擎执行额外的工作。最好和最短的解决方案是_.pick(o, _.identity)
。
从Underscore 1.7.0版开始,您可以使用_.pick
:
_.pick(sourceObj, _.identity)
第二个参数to_.pick
可以是用于选择值的谓词函数。选取谓词返回true的值,而忽略谓词返回falsy的值。
选择_.pick(object,* keys)
返回对象的副本,将其过滤为仅具有列入白名单的键(或有效键的数组)的值。或者,接受一个谓词,指示要选择哪些键。
_.identity
是一个返回第一个参数的辅助函数,这意味着它还可以作为谓词函数来选择真实值并拒绝虚假值。Underscore库还附带了许多其他谓词,例如_.pick(sourceObj, _.isBoolean)
仅保留布尔属性。
如果您经常使用此技术,则可能需要使其更具表现力:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
还提供了下划线版本1.6.0 _.pick
,但是它不接受谓词功能而不是白名单。
_.identity
功能,非常方便。
_.omit(sourceObj, _.isUndefined)
仅删除未定义的值(允许为false,null,0)。
pick(obj, Boolean)
消除假值也是可行的,可以使用相同的方法arr.filter(Boolean)
从假值中清除数组...
_.pick(sourceObj, prop => prop)
_.pick
可使用属性名称,如后使用中所提到的,此功能_.pickBy
_.omitBy( source, i => !i );
这与Emil的回答相反。这种方式使恕我直言读起来更清晰。这更加自我解释。
如果您没有ES6的豪华版,则清洁程度略差: _.omitBy( source, function(i){return !i;});
_.omitBy( source, _.isEmpty)
使用_.isEmpty
(而不是_.identity
为了真实性)也可以方便地从集合中删除空数组和对象,并且可能不方便地删除数字和日期。因此,结果并不是对OP的问题的确切答案,但是在删除空集合时可能很有用。
omitBy
。lodash.com/docs#omitBy
_.pick(source, i => i);
避免否定相同
_.pickBy(source)
就是所需要的。
_.isEmpty(5) === true
。因此,数字值将被丢弃。
通过lodash的变换,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy
改为_.pick
)
_.pickBy(object)
是你所需要的
供对象使用删除。
for(var k in obj){
if(obj.hasOwnProperty(k) && !obj[k]){
delete obj[k];
}
}
突然我需要创建一个函数来递归删除虚假。我希望这有帮助。我正在使用Lodash。
var removeFalsies = function (obj) {
return _.transform(obj, function (o, v, k) {
if (v && typeof v === 'object') {
o[k] = _.removeFalsies(v);
} else if (v) {
o[k] = v;
}
});
};
_.mixin({ 'removeFalsies': removeFalsies });
然后,您可以使用它:
var o = _.removeFalsies({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined,
obj: {
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
}
});
// {
// foo: 'bar',
// obj: {
// foo: 'bar'
// }
// }
尽管_.compact
已记录在数组中使用。它似乎也适用于对象。我只是在chrome,opera和firefox控制台中运行了以下命令:
var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)
[1, 3, function()]
更新:如样本所示,调用_.compact
对象将删除键并返回压缩数组。