我正在构建一个使用D3.js作为图表的仪表板。我有大量的对象。每个对象具有32个键值对,具有相同的键。没有人知道获得给定密钥的所有值的好方法吗?
编辑: 我一问这个问题就找到了一个简单的功能。也想到可能已经存在的功能,我没有找到。
function getValues(data, key){
var values = [];
data.forEach(function(d){
var v = d[key];
if(!d3.set(values).has(v)){
values.push(v);
}
})
return values;
}
答案 0 :(得分:9)
如果您已经在使用d3,请查看Mike Bostock的“下划线等效”要点:https://gist.github.com/mbostock/3934356
所以
data.map(function(d) { return d[key]; });
将为您提供所有价值。如果您只想要唯一值,请使用
d3.set(data.map(function(d) { return d[key]; })).values());
答案 1 :(得分:2)
我还必须使用D3创建很多仪表板。我经常使用的另一个选择是underscore.js。它节省了我的时间,并且我的需求有助于压缩代码。下划线中有一个名为“pluck”的函数,它完全符合您的要求。对于一个对象数组,您可以声明一个键,它将返回所有值。
示例:
var data = [{name: 'dan', value: 40}, {name: 'ryan', value: 50}];
var getKeys = _.pluck(data, 'name');
=> ["dan", "ryan"]
答案 2 :(得分:2)
使用d3.keys()
:
d3.keys(data).filter(function(key) { return key })
答案 3 :(得分:0)
假设您将values
表示为简单的原始值 -
你可以使用这个改变的myne代码(最初用来展平对象) - 找到特定键的所有值(递归):
示例:对于非常复杂对象,让我们找到名为“a”的给定键的所有值
var data ={a:5,g: [{"a":1,"b":[4,5,6,{a:55},[33, new Date()]]},{"c":2},{"a":3}]};
var g=[];
if (!Object.keys) { //not all browsers support it
Object.keys = function (obj) {
var keys = [],
k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
function actualType(o)
{
return Object.prototype.toString.apply(o);
}
var arr=actualType([]);
var obj=actualType({});
function work(a, val)
{
if (actualType(a) == obj || actualType(a) == arr)
{
for (var j = 0; j < Object.keys(a).length; j++)
{
if (Object.keys(a)[j] == val) g.push(a[Object.keys(a)[j]]);
else
work(a[Object.keys(a)[j]], val);
}
}
}
work(data,'a') //'a' is the value we're searching
console.log(g) //[5, 1, 55, 3]