TypeScript hashmap / sözlük arayüzü


100

TypeScript kullanmakta yeniyim ve bir hashmap / sözlük arayüzü uygulamaya çalışıyorum. Şimdiye kadar sahibim

export interface IHash {
    [details: string] : string;
} 

Bu sözdiziminin tam olarak ne anlama geldiğini anlamakta güçlük çekiyorum. Yapacak var x : IHash = {};olsaydım, verilere ekleme / erişme konusunda nasıl hareket ederdim?

Yanıtlar:


140

Normal bir js nesnesi gibi:

let myhash: IHash = {};   

myhash["somestring"] = "value"; //set

let value = myhash["somestring"]; //get

Yaptığın iki şey var [indexer: string] : string

  • TypeScript'e nesnenin herhangi bir dize tabanlı anahtara sahip olabileceğini söyleyin
  • tüm anahtar girişleri için değerin bir dizge türü olması ZORUNLUDUR.

görüntü açıklamasını buraya girin

Açıkça yazılan alanlarla genel bir sözlük yapabilirsiniz. [key: string]: any;

görüntü açıklamasını buraya girin

ör. ageolmalıdır number, while namebir dizge olmalıdır - her ikisi de gereklidir. Herhangi bir örtük alan herhangi bir değer türü olabilir.

Alternatif olarak bir Mapsınıf var:

let map = new Map<object, string>(); 

let key = new Object();

map.set(key, "value");
map.get(key); // return "value"

Bu , anahtar olarak herhangi bir Object örneğine (sadece sayı / dizge değil) sahip olmanızı sağlar .

Nispeten yeni olmasına rağmen, eski sistemleri hedeflerseniz çoklu doldurmanız gerekebilir.


1
"aksi açıkça yazılmadıkça" - ve nasıl ifade edilebilir? AFAIK, açıkça belirtilen herhangi bir alan, dizin imzasına uymalıdır.
Cerberus

huh ... tamamen haklısın. ya onu farklı yazarak karıştırdım anyya da onlar bu davranışı değiştirdiler. Ben ilkine bahse girerim. Teşekkürler. :)
Meirion Hughes


8
var x : IHash = {};
x['key1'] = 'value1';
x['key2'] = 'value2';

console.log(x['key1']);
// outputs value1

console.log(x['key2']);
// outputs value2

Daha sonra sözlüğünüzde yinelemek isterseniz, kullanabilirsiniz.

Object.keys(x).forEach((key) => {console.log(x[key])});

Object.keys, bir nesnenin tüm özelliklerini döndürür, bu nedenle sözlük stili nesnelerden tüm değerleri döndürmek için iyi çalışır.

Sorunuzda bir karma haritadan da bahsetmiştiniz, yukarıdaki tanım sözlük stili bir arayüz içindir. Bu nedenle anahtarlar benzersiz olacak, ancak değerler olmayacak.

Aynı değeri anahtara ve onun değerine atayarak bir hashset gibi kullanabilirsiniz.

Anahtarların benzersiz ve potansiyel olarak farklı değerlere sahip olmasını istiyorsanız, anahtarın nesneye eklemeden önce nesnede var olup olmadığını kontrol etmeniz yeterlidir.

var valueToAdd = 'one';
if(!x[valueToAdd])
   x[valueToAdd] = valueToAdd;

ya da bir çeşit hashset olarak hareket etmek için kendi sınıfınızı oluşturabilirsiniz.

Class HashSet{
  private var keys: IHash = {};
  private var values: string[] = [];

  public Add(key: string){
    if(!keys[key]){
      values.push(key);
      keys[key] = key;
    }
  }

  public GetValues(){
    // slicing the array will return it by value so users cannot accidentally
    // start playing around with your array
    return values.slice();
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.