2013-07-16 67 views
3

我有一個JavaScript數組,我想所有的唯一值的特定鍵。我已經實現了它使用下劃線是這樣的:簡潔的JavaScript來獲取所有唯一值的特定鍵

var v = { "b" : 2 }; 
var w = { "a" : 4, "b" : 2 }; 
var x = { "a" : 1, "b" : 2 }; 
var y = { "a" : 4, "b" : 2, "c" : 3 }; 
var z = { "a" : null, "b" : 2, "c" : 3 }; 
var data = [v,w,x,y,z]; 

// this is the part I'd like to make more concise 
var keys = _.map(data,function(d) { return d.a; }); 
keys = _.unique(keys); 
keys = _.reject(keys, function(k) { return _.isUndefined(k) || _.isNull(k)}); 

http://jsfiddle.net/Gc4tJ/

好像應該有這樣做更緊湊的方式,但我不能完全弄清楚是否存在。我也不需要在這裏使用下劃線。我正在使用D3,但無法完全弄清楚在D3中做到這一點的更簡單的方法。

+1

一個很小的改進是使用動物內臟:'_.pluck(數據,「A」)' –

回答

4

你可以通過使用pluck方法簡化。另外,通過使用compactwithout可以縮短reject的事情。

var values = _.chain(data).pluck("a").unique().compact().value(); 
+0

謝謝你幫助我得到這個壓縮 –

1

如果可以將屬性轉換爲字符串,可以使用d3.set。如果沒有底線,正確地檢查null和undefined是一個小麻煩,它可能是有意義的創建自己的功能,可以這樣做:

keys = d3.set(
    data.map(function(d){ return d.a; }) 
     .filter(function(d){ return (typeof d !== "undefined") ? d !== null : false }) 
    ).values(); 

只需使用香草JavaScript是長一點,但不會轉換爲字符串:

keys = data.map(function(d){ return d.a; }) 
    .reduce(function(p, v){ return p.indexOf(v) == -1 ? p.concat(v) : p; }, []) 
    .filter(function(d){ return (typeof d !== "undefined") ? d !== null : false }); 

由於BERGI指出的那樣,你也可以使用chaining,使您的下劃線代碼更簡潔。

更多下劃線/ JavaScript的/ D3比較,邁克·博斯托克更新與他們之間當量gist幾個星期前。我還有added,但他們開始變得非常棘手/難以理解。

0

你能否truthy值進行過濾?

_.uniq(data.map(d => d.a).filter(d => d)) 
相關問題