2017-05-01 1 views
0

j'ai réussi à accéder différents tableaux et leurs éléments en utilisant une boucle et la fonction eval comme indiqué ci-dessous:Utiliser eval Fonction Pour accéder à des tableaux

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"); 
    } 
    } 
} 

La question que j'est, ce que j'utilise correctement la fonction eval . Si ce n'est pas la bonne façon d'utiliser la fonction eval, comment accéder dynamiquement à différents tableaux de la boucle for sans utiliser la fonction eval?

+0

si vous avez utilisé des tableaux de tableaux? L'accès dynamique aux noms est généralement le signe d'avoir besoin d'autre chose. – Li357

+0

Vous pouvez envelopper vos tableaux dans un objet et accéder à ses propriétés comme 'wrappedObject ['Array' + row]' au lieu d'utiliser 'eval'. – Saravana

+1

* "est-ce que j'utilise correctement la fonction eval" * - Qu'entendez-vous par "correctement"? C'est une syntaxe valide et ça marche, alors "oui". Mais il serait préférable (et facile!) De structurer le code de sorte que vous n'ayez pas besoin de 'eval()' du tout, donc "non". – nnnnnn

Répondre

1

L'utilisation de eval comme ceci, bien que cela puisse fonctionner, est une mauvaise idée et rend très facile l'écriture de code dangereux. Puisque eval exécutera son argument indépendamment de ce qui est réellement passé, les bogues qui aboutissent à un mauvais argument peuvent avoir des conséquences beaucoup plus graves que si vous n'utilisiez pas eval. Les réponses à this SO question offrent un peu plus de perspicacité. considère au lieu d'utiliser un objet de tableaux:

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

* "L'utilisation de' eval' comme ça ... rend très facile l'écriture de code dangereux "* - Pourquoi cela serait-il dangereux? Je suis d'accord que ce n'est pas une bonne idée, mais ce n'est pas vraiment dangereux quand on l'utilise "comme ça". – nnnnnn

+0

@nnnnnn Il est possible que les arguments qui lui sont passés finissent par être quelque chose d'autre que ce que vous attendez en raison d'un bogue et qui entraînent involontairement l'exécution de code déformé. Normalement, alors qu'un bogue comme celui-ci créerait probablement une exception, avec 'eval' il pourrait provoquer une grande variété de comportements inattendus. Dans ce cas précis, ce n'est probablement pas si grave, mais le potentiel est certainement là. – Hydrothermal

1

Je ne dirais pas en utilisant eval comme ceci est une bonne idée. eval est très rarement utilisé car il est difficile de déboguer et peut être remplacé par quelque chose de plus facile à comprendre dans la plupart des cas. Il a des cas d'utilisation valides, mais ce n'est pas l'un d'entre eux.

Utilisez un tableau de tableaux à la place:

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 
     } 
    } 
}