2017-05-01 30 views
0

我已成功访问使用for循环和eval函数不同的阵列和它们的元素,如下所示:使用eval函数来访问阵列

var Array1 = [A,B,C,D]; 
var Array2 = [D,B,C,A]; 
var Array3 = [B,C,A,D]; 
var Array4 = [A,D,B,C]; 

for(var row = 1; row <=4; row++){ 
    for(var column = 0; column <=3; column++){ 
    if(row<4 && eval("Array" + row)[column] == eval("Array" + (row +1))[column]){ 
     console.log("Value of Array" + row + "column" + column + "is equal to" + "value of Array" + eval(row + 1) + "column" + column + "\n"); 
    } 
    } 
} 

我的问题是,我在正确使用eval功能。如果它不是使用eval函数的正确方法,那么如何在不使用eval函数的情况下动态访问for循环中的不同数组?

+0

如果使用数组的数组是什么?动态访问名称通常是需要别的东西的标志。 – Li357

+0

你可以将数组包装在一个对象中,而不是使用'eval'来访问它的属性,如'wrappedObject ['Array'+ row]'。 – Saravana

+1

*“我是否正确使用eval函数”* - “正确”是什么意思?这是有效的语法,它的工作原理,所以“是”。但是,构建代码会更好(也很容易!),因此根本不需要'eval()',所以“否”。 – nnnnnn

回答

1

像这样使用eval虽然它可能工作,但这是一个坏主意,并且使得编写危险代码变得非常容易。由于eval将执行其论证,而不管实际传递的是什么,所以导致传递错误参数的错误会比如果您不使用eval更严重。 this SO question的答案提供了更多的见解。相反,考虑使用数组的对象:

var arrays = { 
    Array1: [A,B,C,D], 
    Array2: [D,B,C,A], 
    Array3: [B,C,A,D], 
    Array4: [A,D,B,C] 
} 

for(var row = 1; row <=4; row++){ 
    for(var column = 0; column <=3; column++){ 
    if(row<4 && arrays["Array" + row][column] == arrays["Array" + (row + 1)][column]){ 
     console.log("Value of Array" + row + "column" + column + "is equal to" + "value of Array" + (row + 1) + "column" + column + "\n"); 
    } 
    } 
} 
+0

*“使用'eval'就像这样......编写危险代码非常容易”* - 为什么它会很危险?我同意这不是一个好主意,但使用“像这样”并不是很危险。 – nnnnnn

+0

@nnnnnn传递给它的参数可能会因为错误而导致无法执行变形代码,从而可能最终成为您期望以外的内容。通常情况下,像这样的错误可能会创建一个异常,使用'eval'它可能会导致各种意外行为。在这个特定的情况下,它可能并不那么糟糕,但潜力肯定存在。 – Hydrothermal

1

我不会说使用eval这样是一个好主意。 eval非常难以使用,因为它很难调试,并且可以用大多数情况下更容易理解的东西替换。它有有效的用例,但这不是其中之一。

使用数组的数组来代替:

var A = 2, B = 2, C = 3, D = 4; 

var grid = [ 
    [A,B,C,D], 
    [D,B,C,A], 
    [B,C,A,D], 
    [A,D,B,C] 
] 

for (var row = 0; row < grid.length; row++) { 
    for (var column = 0; column < grid[0].length; column++) { 
     if (row + 1 < grid.length && grid[row][column] === grid[row + 1][column]) { 
      // they're equal 
     } 
    } 
}