过滤下划线中的对象

时间:2015-03-31 18:52:55

标签: javascript loops filter underscore.js each

我试图在下划线中创建filterObject mixin。它不太顺利,有什么我想念的吗?

_.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的道具。

3 个答案:

答案 0 :(得分:2)

从版本1.7开始,_.pick函数可以使用一个可以用来代替filterObject的iteratee:

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

答案 1 :(得分:0)

这样做,只需要mapObject然后filterObject

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

答案 2 :(得分:0)

以下是使用开源项目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;

});