我正在尝试重写d3.js提供的示例。原始代码有这样的函数:
function interpolateValues(values, year) {
var i = bisect.left(values, year, 0, values.length - 1),
a = values[i];
if (i > 0) {
var b = values[i - 1],
t = (year - a[0]) / (b[0] - a[0]);
return a[1] * (1 - t) + b[1] * t;
}
return a[1];
}
其中'values'是一个如下所示的数组:
"income":[[1800,359.93],[1820,359.93],[1913,556.12],[1950,3363.02], etc.
但是,我们以不同的方式存储数据。与“名称”:[[年,价值]],...格式不同,我们的数据以不同的方式存储,非常类似于数据库(要跟随的样本数据):
{"region":"A","income":1178.0,"lifeExpectancy":788.0,"year":1800.0,"population":1292.0,"country":"Angola"},
{"region":"B","income":847.0,"lifeExpectancy":1183.0,"year":1800.0,"population":803.0,"country":"Benin"},
{"region":"A","income":798.0,"lifeExpectancy":765.0,"year":1801.0,"population":967.0,"country":"Angola"},
{"region":"B","income":1293.0,"lifeExpectancy":1497.0,"year":1801.0,"population":792.0,"country":"Benin"},
我希望将interpolateValues()函数替换为不同的函数,如下所示:
SELECT income FROM dataset WHERE year = 1980
我知道这是SQL,我只是用它来尝试解决这个问题。 基本上你有一个包含数据的数组,一个包含年数的数组,我正在寻找一个返回特定年份数据的函数。
插值功能很不错,但现在它并不太重要。问题是我只是学习使用js,而且到目前为止我尝试过的任何事情都失败了。
感谢您的帮助!
编辑: 一些额外的信息需要澄清:
我有这个功能,有效:
function provideData(year) {
return nations.map(function(d) {
return {
name: d.country,
region: d.region,
income: d.income,
population: d.population,
lifeExpectancy: d.lifeExpectancy
};
});
}
但是,正如您所期望的那样,它会返回完整的数组,从而产生超过一百年的数据输出。现在,如果d.year == year ..
,只有一种方法可以返回d.income答案 0 :(得分:1)
答案 1 :(得分:1)
如果你不想使用下划线,这应该是for循环可行的。
var plotData = []
for(var i = 0; i < data.length; i++){
if(data[i].year == targetYear){
plotData.push(data[i]);
}
}
我认为下划线也使用循环,所以效率损失不大。如果你知道你的数据是在你的年度超过你的目标年份时打破for循环的,那么你可以提高for循环的效率,如下所示:
function getData(data){
var plotData = []
for(var i = 0; i < data.length; i++){
if(data[i].year == targetYear){
plotData.push(data[i]);
} else if(data[i].year > targetYear){
return 0;
}
}
return 0;
}
要使用插值,您可以在for循环中构建与预期数组匹配的数组,或者调用a.year
和a.value
而不是a[0]
和a[1]
。
答案 2 :(得分:0)
您可以使用Alasql JavaScript SQL库。
这是一个例子:
var data = [ {"region":"A","income":1178.0,"lifeExpectancy":788.0,"year":1800.0,"population":1292.0,"country":"Angola"},
{"region":"B","income":847.0,"lifeExpectancy":1183.0,"year":1800,"population":803.0,"country":"Benin"},
{"region":"A","income":798.0,"lifeExpectancy":765.0,"year":1801,"population":967.0,"country":"Angola"},
{"region":"B","income":1293.0,"lifeExpectancy":1497.0,"year":1801,"population":792.0,"country":"Benin"}];
var res = alasql('SELECT MATRIX year, SUM(income) FROM ? GROUP BY year',[data]);
试试这个例子in jsFiddle。
Alasql使用带有一些JavaScript扩展的标准SQL,因此您可以构造任何表达式