使用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
将放弃键和返回压缩数组。