2014-07-01 28 views
2
dataBase[0].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[0].columnline]); }); 

dataBase[1].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[1].columnline]); }); 

dataBase[2].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[2].columnline]); }); 

dataBase[3].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[3].columnline]); }); 

dataBase[4].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[4].columnline]); }); 

dataBase[5].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[5].columnline]); }); 

dataBase[6].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[6].columnline]); }); 

dataBase[7].valueline = d3.svg.line() 
.x(function(d) { return x(d["Date"]); }) 
.y(function(d) { return y(d[dataBase[7].columnline]); }); 

我已经试过声明:有人能告诉我如何用循环替换下面的JavaScript代码?

for (var i = 0; i < dataBase.length; i++) { 

dataBase[i].valueline = d3.svg.line() 
    .x(function(d) { return x(d["Date"]); }) 
    .y(function(d) { return y(d[dataBase[i].columnline]); }); 

} 

但这并没有因为我在

function(d) { 
    return y(d[dataBase[i].columnline]); 
} 

工作是不一样的我作为循环中的我。我也曾尝试绑定技术从stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example

function createfunc(count) { 
    return function(d) { 
     return y(d[dataBase[count].columnline]); 
    }; 
} 
for (var i = 0; i < dataBase.length; i++) { 

dataBase[i].valueline = d3.svg.line() 
    .x(function(d) { return x(d["Date"]); }) 
    .y(createfunc(i)); 
} 

但也导致错误也是如此。有人能告诉我如何使八行代码循环?

+0

你有一个范围问题,但没有完整的代码不能尝试做一个解决方案 – juvian

+2

'但这也导致了一个错误。“什么错误? –

回答

0

正如上面的评论者所说,这几乎肯定是一个范围问题,但很难确切地说没有看到周围的代码就会出现什么样的范围问题。如果你在JavaScript中遇到范围问题,一个通常的好主意是尽可能在独立函数中进行包装,因为它们各自都有自己的范围,并且可以作为一定程度的闭包。也许你可以试试:

function xFunc(d) { 
    return function (d) { return x(d["Date"]) }; 
} 

function yFunc(d, i) { 
    return function (d) { return y(d[dataBase[i].columnline]) }; 
} 

for (var i = 0; i < dataBase.length; i++) { 

    dataBase[i].valueline = d3.svg.line() 
     .x(xFunc(d)) 
     .y(yFunc(d, i)); 

} 

我不知道这是否会实际工作,即使它可能有一个更好的方式来构建关闭。如果您对Immediately Invoked Function Expressions不熟悉,请查看this post,并考虑找到一种方法将它们应用到您的代码中。它们非常适合在JavaScript中防止范围问题。

相关问题