JavaScript数组查询

JavaScript数组查询,javascript,arrays,json,Javascript,Arrays,Json,我试图重写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

我试图重写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];
}
"income":[[1800,359.93],[1820,359.93],[1913,556.12],[1950,3363.02], etc.
SELECT income FROM dataset WHERE year = 1980
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;
}
其中“values”是一个如下所示的数组:

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];
}
"income":[[1800,359.93],[1820,359.93],[1913,556.12],[1950,3363.02], etc.
SELECT income FROM dataset WHERE year = 1980
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;
}
但是,我们以不同的方式存储数据。与“名称”不同,[[year,value]],。。。格式,我们的数据以不同的方式存储,很像数据库(下面是示例数据):

我希望用一个不同的函数替换interpolateValues()函数,该函数如下所示:

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];
}
"income":[[1800,359.93],[1820,359.93],[1913,556.12],[1950,3363.02], etc.
SELECT income FROM dataset WHERE year = 1980
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;
}
我知道这是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.income,如果d.year==year..

您可以尝试并查看答案:

如果您不想使用下划线,这应该可以通过for循环实现

var plotData = []

for(var i = 0; i < data.length; i++){
    if(data[i].year == targetYear){
        plotData.push(data[i]);
    }
}
<代码>var plotData=[] 对于(变量i=0;i 我相信下划线也会使用循环,所以不会造成太多的效率损失。如果您知道您的数据是按顺序排列的,那么您可以通过在您的年份超过目标年份时中断for循环来提高for循环的效率,方法如下:

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];
}
"income":[[1800,359.93],[1820,359.93],[1913,556.12],[1950,3363.02], etc.
SELECT income FROM dataset WHERE year = 1980
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;
}
函数getData(数据){ 变量plotData=[] 对于(变量i=0;itargetYear){ 返回0; } } 返回0; } 要使用interpolate,您可以在for循环中构建一个与预期数组匹配的数组,或者调用
a.year
a.value
,而不是
a[0]
a[1]
,您可以使用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]);
试试这个例子


Alasql使用标准SQL和一些JavaScript扩展,因此您可以构造任何表达式

,看起来您不熟悉命令式代码范例。在JS中,您不会告诉机器您想要得到什么(就像在SQL中一样),而是告诉机器如何去做。所以,您需要定义新阵列,在旧阵列上运行cycle,比较您的条件,并推送到您想要的新阵列实体。我想插值是另一种功能。我以前尝试过underline.js,但遇到的问题是设置年份数组的条件。这是合乎逻辑的,因为此时两个阵列之间没有实际连接,请保存它们的顺序。您当前的问题是什么!这个解决方案奏效了,谢谢。当然,我必须对它进行一些调整,以适应现有的代码。但最终一切都解决了。谢谢你的帮助。