使用Underscore.js从Object中删除空的属性/错误值

我有一个对象有几个属性。 我想删除任何具有falsy值的属性。

这可以通过compact的数组来实现,但是对象呢?

你可以做你自己的下划线插件(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所 指出的那样 ,这个mixin会影响原始对象,而原始的compact下划线方法会返回数组的副本 。
为了解决这个问题,使我们的compactObject更像它的表亲 ,这里有一个小小的更新:

 _.mixin({ compactObject : function(o) { var clone = _.clone(o); _.each(clone, function(v, k) { if(!v) { delete clone[k]; } }); return clone; } }); 

由于下划线版本1.7.0,您可以使用_.pick

 _.pick(sourceObj, _.identity) 

说明

_.pick的第二个参数可以是select值的谓词函数。 谓词返回truthy的值被选中,并且谓词返回falsy的值被忽略。

select _.pick(对象,*键)

返回该对象的副本,过滤为只有白名单 (或有效键数组)的值。 或者接受一个谓词,指出要select哪个键。

_.identity是一个帮助函数,返回它的第一个参数,这意味着它也可以作为一个谓词函数来selecttruthy值并拒绝错误的函数。 _.pick(sourceObj, _.isBoolean)库也带有一些其他的谓词,例如_.pick(sourceObj, _.isBoolean)将只保留布尔属性。

如果你使用这种技术很多,你可能想要使它更具performance力:

 var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something pickNonfalsy(sourceObj); 

下划线版本1.6.0也提供_.pick ,但它不接受谓词function而不是白名单。

快速清除: _.omit( source, i => !i );

这与Emil的回答相反。 这样imho读取更清晰; 这更加自我解释。

如果你没有ES6的奢侈品,稍微干净些: _.omit( source, function(i){return !i;});

备用: _.omit( source, _.isEmpty)

使用_.isEmpty ,而不是_.identity的真实性, 也将方便地从集合中删除空的数组和对象,也许不便删除数字和date 。 因此,结果并不是OP的问题的确切答案,但是在查找删除空集合时可能会有用。

随着洛德的转变 ,

 _.transform(obj, function(res, v, k) { if (v) res[k] = v; }); 
 Object.keys(o).forEach(function(k) { if (!o[k]) { delete o[k]; } }); 

你可以创build一个浅的克隆:

 _(obj).reduce(function(a,v,k){ if(v){ a[k]=v; } return a; },{}); 

供对象使用删除。

 for(var k in obj){ if(obj.hasOwnProperty(k) && !obj[k]){ delete obj[k]; } } 

突然间我需要创build一个函数来删除recursion的falsies。 我希望这有帮助。 我正在使用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' // } // } 

要添加到gion_13的答案:

 _.mixin({ compactObject : function(o) { var newObject = {}; _.each(o, function(v, k) { if(v !== null && v !== undefined) { newObject[k] = v } }); return newObject; } }); 

这一个创build一个新的对象,并添加键和值,而不是克隆所有内容和删除键值对。 微小的差异。

但更重要的是,明确地检查null和undefined而不是falsey,这将删除具有false作为值的键值对。

虽然_.compact被logging在数组中使用。 它似乎也适用于对象。 我只是在铬,歌剧和firefox控制台上运行以下:

 var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}} undefined _.compact(obj) [1, 3, function()] 

更新:正如示例指出对对象调用_.compact将放弃键和返回压缩数组。