81 javascript arrays object underscore.js
我有一个具有多个属性的对象.我想删除任何有假值的属性.
这可以通过compact
数组来实现,但对象呢?
Emi*_*erg 167
从Underscore 1.7.0开始,您可以使用_.pick
:
_.pick(sourceObj, _.identity)
Run Code Online (Sandbox Code Playgroud)
第二个参数_.pick
可以是用于选择值的谓词函数.将选择谓词返回真值的值,并忽略谓词返回假值的值.
选择 _.pick(对象,*键)
返回对象的副本,过滤为仅具有白名单键(或有效键数组)的值.或者,接受一个谓词,指示要选择的键.
_.identity
是一个辅助函数,它返回它的第一个参数,这意味着它也可以作为谓词函数,选择真值并拒绝虚假值.Underscore库还附带了许多其他谓词,例如_.pick(sourceObj, _.isBoolean)
只保留布尔属性.
如果你经常使用这种技术,你可能想让它更具表现力:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
Run Code Online (Sandbox Code Playgroud)
提供了Underscore版本1.6.0 _.pick
,但它不接受谓词函数而不是白名单.
gio*_*_13 47
你可以制作自己的下划线插件(mixin):
_.mixin({
compactObject: function(o) {
_.each(o, function(v, k) {
if(!v) {
delete o[k];
}
});
return o;
}
});
Run Code Online (Sandbox Code Playgroud)
然后将其用作本机下划线方法:
var o = _.compactObject({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
});
Run Code Online (Sandbox Code Playgroud)
正如@AndreiNeculau所 指出的,这个mixin会影响原始对象,而原始的compact
下划线方法会返回数组的副本.
为了解决这个问题并使我们的compactObject
行为更像它的堂兄,这里有一个小小的更新:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
Run Code Online (Sandbox Code Playgroud)
Shw*_*ogg 45
_.omit( source, i => !i );
这与Emil的答案相反.这样imho读得更清楚; 它更加自我解释.
如果你没有ES6的奢侈品,那就不那么干净了: _.omit( source, function(i){return !i;});
_.omit( source, _.isEmpty)
使用_.isEmpty
而不是_.identity
真实性,还可以方便地从集合中删除空数组和对象,并可能不方便地删除数字和日期.因此,结果并不是OP问题的准确答案,但是在寻找删除空集合时它可能很有用.
rai*_*ine 21
随着lodash的改造,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
Run Code Online (Sandbox Code Playgroud)
Flo*_*ine 17
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
Run Code Online (Sandbox Code Playgroud)
您可以创建浅克隆:
_(obj).reduce(function(a,v,k){
if(v){ a[k]=v; }
return a;
},{});
Run Code Online (Sandbox Code Playgroud)
用于对象使用删除.
for(var k in obj){
if(obj.hasOwnProperty(k) && !obj[k]){
delete obj[k];
}
}
Run Code Online (Sandbox Code Playgroud)
突然间我需要创建一个函数来删除递归错误。我希望这有帮助。我正在使用 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 });
Run Code Online (Sandbox Code Playgroud)
然后你可以使用它:
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'
// }
// }
Run Code Online (Sandbox Code Playgroud)