2015-04-22 71 views
-2

試圖用下劃線庫編寫更多功能性JavaScript。關於如何改進這個功能比命令更有用的想法?如何讓這個功能更強大?

每一對中的第一個是一個「桶」,第二個是一個值,我想遍歷信息並獲得每個桶中內容的唯一列表。

var a = [ 
    ['A',1], 
    ['A',1], 
    ['A',1], 
    ['A',2], 
    ['B',1], 
    ['B',2], 
    ['B',2], 
    ['B',4], 
    ['C',6], 
    ['D',5] 
]; 

//result should be: 
// { 
//  A: [1,2], 
//  B: [1,2,4], 
//  C: [6], 
//  D: [5] 
// } 

_.chain(a) 
.groupBy(function (pair) { 
    var group = pair[0]; 
    return group; 
}) 
.mapObject(function (val, key) { 
    var results = _.chain(val) 
        .map(function (pair) { 
        return pair[1] 
        }) 
        .uniq() 
        .value(); 
    return results; 
}) 
.value(); 
+0

所屬的代碼審查。 – Nit

+0

這段代碼實際上是按照預期工作的嗎? – nhgrif

回答

2
_.reduce(a, function(memo, pair){ 
    var key = pair[0], value = pair[1]; 
    var bucket = memo[key] = memo[key] || []; 
    if (!_.contains(bucket, value)) bucket.push(value); 
    return memo; 
}, {}); 
2

怎麼是這樣的:

var groups = _.groupBy(a, '0'); 

var result = _.mapObject(groups, function(group){ 
    return _.uniq(_.pluck(group, '1')); 
}); 
+0

這比我的答案要好。使用reduce有點像作弊。您的解決方案可以在沒有任何任務的情況下完成,這是IMO的優選方案 – idbehold