我有几个相关的json数据文件。不要过多地关注专有数据,并简化它......
假设一个json文件"businesses"
描述了企业,其功能是其名称,地址等,以及唯一的ID。这个数字在数十万。
然后另一个json文件"ratings"
为客户提供的商家保留评级1-5,以唯一客户ID和商家ID为键。所有评级都与"businesses"
中的商家相对应(我希望如此)。 "ratings"
是一个小得多的文件,实际上我只使用了我所拥有的数万个评级中的1000个。
我还有一些其他相关文件,但我现在只是限制它们。
假设我制作某种评级的d3图表,比如条形图,其中每个垂直条代表一项业务,高度由其平均等级决定。
我想这样做,以便当您将鼠标悬停在条形图上时,您可以看到商家名称,为此,我必须同时从"businesses"
和"ratings"
进行抽奖。我一直只看到一个数据集的例子。
我加载两个数据集并将每个数据集分配给一个变量:
(通常我会进行错误检查,但为了简单起见我将其删除)
var businesses = [];
var ratings = [];
d3.json("data/business.json", function(json) {
businesses = json;
console.log(businesses);
});
d3.json("data/rating.json", function(json) {
ratings = json;
console.log(ratings);
});
两个数据集都出现在控制台中。我制作酒吧,如下:
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
svg.selectAll("rect")
.data(ratings)
.enter()
.append("rect")
(more attribs for ht, width, fill, etc.)
我可以显示商家ID:
.append("title").text(function(d) {return "" + d.business_id ;});
但它只是一个无意义的字符串,数字,连字符和下划线。
如何最有效地从企业阵列中提取与该ID匹配的商家名称?
我试过
.append("title").text(function(d) {return getBizName(d.business_id); });
调用
var getBizName = function(bizId) {
var i;
for (i=0; i<businesses.length; i++) {
if (businesses[i].business_id==bizId) return businesses[i].name;
}
};
它不起作用。我尝试了一些方法,如果我有标题出现,他们会说undefined
。如果我在控制台中输入getBizName(some-valid-business-id)
,则会显示some-valid-business-id is not defined
。
有什么想法吗?请记住,我是新手,所以我犯了很多愚蠢的错误。我也困了。感谢。
答案 0 :(得分:1)
由于我不知道您的businesses
和ratings
数组的结构,我不确定您的getBizName
函数有什么问题,但通常情况下,该技术可以正常工作
请参阅此处的示例(将鼠标悬停在条形图上显示商家名称):http://jsfiddle.net/n1qnyv9u/
如果name
位于businesses
数组内更深处,您可能无法正确访问它。
修改:由于您说businesses
通常是一个大型数据集且ratings
要小得多,因此您可能希望使用array.map
来更新{{ 1}}提前包含ratings
。这样,每次name
栏悬停时,您都不必致电getBizName
。
获取ratings
和businesses
中的数据后,请执行以下操作:
ratings
现在ratings.map(function(a) {
a.business_name=getBizName(a.bid);
return a;
}
);
包含ratings
。构建title元素时,只需使用下面的business_name
:
business_name
此处更新了小提琴:http://jsfiddle.net/n1qnyv9u/2/
您可能还希望查看https://github.com/Caged/d3-tip以获得更好看的工具提示。