我有一个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)});
似乎应该有一个更紧凑的方法来做到这一点,但我无法弄清楚是否有。我也不需要在这里使用下划线。我正在使用d3,但在d3中也无法找到更简单的方法。
答案 0 :(得分:4)
您可以使用pluck
方法进行简化。此外,使用compact
或without
可缩短reject
内容。
var values = _.chain(data).pluck("a").unique().compact().value();
答案 1 :(得分: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();
只使用vanilla 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比较,Mike Bostock在几周前更新了gist之间的等价物。我已经added了一些,但他们开始变得非常棘手/难以理解。
答案 2 :(得分:0)
你可以过滤真值吗?
_.uniq(data.map(d => d.a).filter(d => d))