Get key by value mit JavaScript

Um von einem Wert (value) den zugehörigen Schlüssel (key) in einem JavaScript-Objekt zu finden, ist folgender Code hilfreich:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Object.prototype.getKey = function(value){
  for(var key in this){
    if(this[key] == value){
      return key;
    }
  }
  return null;
};
 
// ISO 639: 2-letter codes
var languageCodes = {
  DA: 'Danish',
  DE: 'German',
  DZ: 'Bhutani',
  EL: 'Greek',
  EN: 'English',
  EO: 'Esperanto',
  ES: 'Spanish'
};
 
var key = languageCodes.getKey('Greek');
console.log(key); // EL

Vorsicht:

Die vorgestellte Variante hat ein Problem mit assoziativen Arrays, da durch das Object-Prototyping die „getKey“-Methode zu jedem Objekt (das man mit JavaScript erstellt) gehört. Das führt zu folgendem Nebeneffekt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Object.prototype.getKey = function(value){
  for(var key in this){
    if(this[key] == value){
      return key;
    }
  }
  return null;
};
 
var companies = {}; // Object
companies["GD"] = "GameDuell";
companies["HP"] = "Hewlett-Packard Company";
companies["MS"] = "Microsoft";
 
for(var key in companies){
  console.log("Key: "+key+", Type: "+typeof(companies[key]));
  // Output:
  // Key: GD, Type: string
  // Key: HP, Type: string
  // Key: MS, Type: string
  // Key: getKey, Type: function | The function has become an element of the object!!
}

Daher sollte man die „getKey“-Methode in einen eigenen „Namespace“ packen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var BN = BN || {};
BN.Utilities = {};
BN.Utilities.getKey = function(value,object){
  for(var key in object){
    if(object[key] == value){
      return key;
    }
  }
  return null;
};
 
var companies = {};
companies["GD"] = "GameDuell";
companies["HP"] = "Hewlett-Packard Company";
companies["MS"] = "Microsoft";
 
for(var key in companies){
  console.log("Key: "+key+", Type: "+typeof(companies[key]));
  // Output:
  // Key: GD, Type: string
  // Key: HP, Type: string
  // Key: MS, Type: string
}
 
var key = BN.Utilities.getKey("GameDuell",companies);
console.log(key); // GD

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.