使用 Underscore.js 从对象中删除空属性/虚假值

新手上路,请多包涵

我有一个具有多个属性的对象。我想删除任何具有虚假值的属性。

这可以用 compact 在数组上实现,但是对象呢?

原文由 user1082754 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 406
2 个回答

你可以制作自己的下划线插件(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;
  }
});

原文由 gion_13 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Underscore 版本 1.7.0 开始,您可以使用 _.pick

 _.pick(sourceObj, _.identity)

解释

_.pick 的第二个参数可以是用于选择值的谓词函数。选择谓词返回 值的值,忽略谓词返回 值的值。

选择_.pick(object, *keys)

返回 object 的副本,过滤为仅具有白名单 (或有效键数组)的值。或者接受指示要选择哪些键的谓词。

_.identity 是一个返回其第一个参数的辅助函数,这意味着它也可以用作选择真值并拒绝假值的谓词函数。 Underscore 库还带有许多其他谓词,例如 _.pick(sourceObj, _.isBoolean) 将仅保留布尔属性。

如果你经常使用这种技术,你可能想让它更具表现力:

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

Underscore 版本 1.6.0 也提供了 _.pick ,但它不接受谓词函数而不是白名单。

原文由 Emil Lundberg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题