3

我有一个 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 中找到更简单的方法。

4

3 回答 3

4

您可以使用该pluck方法进行简化。此外,reject可以通过使用compact或来缩短事物without

var values = _.chain(data).pluck("a").unique().compact().value();
于 2013-07-16T20:20:30.877 回答
1

如果您对将 a 属性强制转换为字符串感到满意,则可以使用 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 指出的那样,您还可以使用链接来使您的下划线代码更简洁。

对于更多的下划线/javascript/d3 比较,Mike Bostock几周前更新了一个要点,其中包含它们之间的等价物。又添加了一些,但它们开始变得非常棘手/难以理解。

于 2013-07-16T20:23:32.333 回答
0

你能过滤真实值吗?

_.uniq(data.map(d => d.a).filter(d => d))
于 2017-08-05T16:16:23.660 回答