过滤下划线中的对象

Filtering objects in underscore

我正在尝试在下划线中创建 filterObject 混入。进展不太顺利,是不是我遗漏了什么?

_.mixin({
  filterObject: function(collection, fn){
    var n = []
    _.each(collection, function(value, key){
      var decider = fn(value, key)
      if(decider){
        var temp = {}
        temp[key] = value
        n.push(temp)
      }
    })
    return _.extend.apply(null, n);
  }
})

var actionsFlags = {
  "wallpaper": {
    "images": true,
    "queue": false,
  },
  "notify":{
    "message": true,
    "open": true,
    "queue": false,
  },
}

var requiredFlags = _.filterObject(actionsFlags, function(flags){
  return _.filterObject(flags, function(flag){
    return flag
  })
})

我只需要一种方法让 actionsFlags 对象只包含等于 true.

的道具

这行得通,只需 mapObject 然后 filterObject

  var requiredFlags = _.mapObject(actionsFlags, function(flags){
    return _.filterObject(flags, function(flag){
      return flag
    })
  })

下面是如何使用开源项目 jinqJs http://www.jinqJs.com

See Fiddle

var result = jinqJs().from(actionsFlags).select( function(row) {
var ret = {};
for(var o in row)
{
    ret[o] = {};   
    for(var i in row[o])
    {
        if (row[o][i])
            ret[o][i] = true;
    }

}

return ret;

});

从版本 1.7 开始,_.pick 函数可以接受一个迭代器,它可以用来代替 filterObject:

var requiredFlags = _.mapObject(actionsFlags, function(flags){
    return _.pick(flags, function(flag){
        return flag === true;
    })
})