2015-03-31 83 views
0

我試圖在下劃線中創建一個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

回答

2

隨着1.7版本的_.pick功能可以採取iteratee它可以用來代替filterObject的:

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

這個工程,只需要​​然後filterObject

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

您可以替換的呼叫通過調用_.filterObject強調的_.pick從1.7版本可以採取迭代。 – 2015-03-31 20:31:46

+0

非常感謝!如果你想提交一個答案,我會接受它。 – ThomasReggi 2015-03-31 20:33:45

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; 

})做到這一點;