2017-05-01 3 views
0

ich erfolgreich verschiedene Arrays und deren Elemente eine for-Schleife und der eval-Funktion, wie unten gezeigt aufgerufen haben:eval Funktion Verwenden von Arrays So greifen

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

Die Frage, die ich habe ist, verwende ich richtig die Funktion eval . Wenn es nicht der richtige Weg ist, die eval-Funktion zu verwenden, wie kann ich dynamisch auf verschiedene Arrays in der for-Schleife zugreifen, ohne die eval-Funktion zu verwenden?

+0

Was passiert, wenn Sie Arrays von Arrays verwendet? Der dynamische Zugriff auf Namen ist normalerweise ein Zeichen dafür, dass etwas anderes benötigt wird. – Li357

+0

Sie können Ihre Arrays in ein Objekt einfügen und auf seine Eigenschaften wie 'wrappedObject ['Array' + Zeile]' zugreifen, anstatt 'eval' zu verwenden. – Saravana

+1

* "verwende ich die eval-Funktion korrekt" * - Was meinst du mit "richtig"? Es ist gültige Syntax und es funktioniert, also "ja". Aber es wäre besser (und einfach!), Den Code so zu strukturieren, dass du 'eval()' überhaupt nicht brauchst, also "nein". – nnnnnn

Antwort

1

Verwendung von eval so, obwohl es funktionieren könnte, ist eine schlechte Idee und macht es sehr einfach, gefährlichen Code zu schreiben. Da eval sein Argument unabhängig davon ausführt, was tatsächlich übergeben wird, können Fehler, die zur Übergabe des falschen Arguments führen, viel ernstere Konsequenzen haben, als wenn Sie eval nicht verwenden würden. Die Antworten auf this SO question bieten einige mehr Einblick. Stattdessen betrachtet ein Objekt von Arrays:

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

* "Verwendung von' eval' wie folgt ... macht es sehr einfach, gefährlichen Code zu schreiben "* - Warum wäre es gefährlich? Ich stimme zu, es ist keine gute Idee, aber es ist nicht wirklich gefährlich, wenn es "so" benutzt wird. – nnnnnn

+0

@nnnnnn Es ist möglich, dass die Argumente, die an sie übergeben werden, aufgrund eines Fehlers möglicherweise etwas anderes sind, als Sie erwarten, und dass Sie unbeabsichtigt verformten Code ausführen. Normalerweise würde ein Fehler wie dieser wahrscheinlich nur eine Ausnahme erzeugen, mit "eval" kann es eine Vielzahl von unerwarteten Verhaltensweisen verursachen. In diesem speziellen Fall ist es wahrscheinlich nicht so schlimm, aber das Potenzial ist sicherlich vorhanden. – Hydrothermal

1

würde ich sagen, nicht eval mit wie dies eine gute Idee ist. eval ist sehr selten verwendet, da es schwer zu debuggen ist und in den meisten Fällen mit etwas leichter zu verstehen ersetzt werden kann. Es hat gültige Anwendungsfälle, aber das ist keiner von ihnen.

ein Array von Arrays Verwenden Sie stattdessen:

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