2015-11-23 82 views
3

對於像列表(有許多許多條目):我可以在lodash中過濾countBy嗎?

- 
    id: cs13157 
    name: 'Current Load' 
- 
    id: cs1085 
    name: 'Check CPU' 
- 
    id: cs1070 
    name: Uptime 
- 
    id: cs1070 
    name: 'Total Processes' 

我有一個.countBy對於正在恢復一些計數是大於1,有些等於1。我只關心更大的IDS超過1個值,因爲這表示問題。但由於countBy返回一個大對象,我必須循環哈希表中的值:

counts = ld(list).countBy('id').value(); 
for (k in counts) { 
    v = counts[k]; 
    if (!(v > 1)) { 
    continue; 
    } 
    logger.error("found duplicate value for ID " + k); 
    errored = true; 
} 
// throw if errored is true 

這似乎像太多的代碼,但我看不到的方式來與lodash迅速做到這一點。我可以pluck/map/filter找到錯誤的值。有很多方法可以做到這一點,但我想知道是否有一種方法可以只用lodash獲得大於1的ID列表,而不用循環。

SSCE:

var arr, keys, ld, s; 

    s = "- {id: 2240errorapp, name: 'app error count'}\n- {id: 2240errorinf, name: 'infrastructure error count'}\n- {id: '2112', name: calls}\n- {id: '2112', name: calls}\n- {id: 2112v, name: violations}\n- {id: 2112avg, name: 'average response time'}\n- {id: 2112errorapp, name: 'app error count'}\n- {id: 2112errorinf, name: 'infrastructure error count'}"; 

    ld = require('lodash'); 

    arr = (require('yamljs')).parse(s); 

    keys = ld(arr).countBy('id').filter(function(k, v) { 
    return k[v] > 1; 
    }).value(); 

    console.dir(keys); 

預期值:['2112'](重複)。實際值:[]

回答

3
counts.pick(function(v) { return v > 1; }); 

pick而不是filter。在您的代碼中也是v > 1而不是k[v] > 1

filter想要一個對象數組,而不是具有許多統一鍵的對象。 pick喜歡使用對象屬性並過濾掉密鑰。

我的答案是this question的副本,但我不會推薦關閉此問題,因爲有多種方法可以解決此問題。

+0

如果我有3個重複項,就會返回類似'[2,2,2]'的東西。 – jcollum

+0

@jcollum .uniq()之後? – djechlin

+0

難道這不會返回'2'嗎? – jcollum

相關問題