2017-08-22 7 views
0
function HashTable(){ 
    var size = 0; 
    var entry = new Object(); 
    this.add = function(key,value){ 
     if(!containsKey(key)){ 
      size++; 
     } 
     entry[key] = value; 
    } 

    this.getValue = function(key){ 
     return containsKey(key)?entry[key]:null; 
    } 

    this.remove = function(key){ 
     if (containsKey(key) && delete entry[key]) { 
      size--; 
     } 
    } 

    this.containsKey = function(key){ 
     return (key in entry); 
    } 

    this.containsValue = function(value){ 
     for(var prop in entry){ 
      if(entry[prop] == value){ 
       return true; 
      } 
     } 
     return false; 
    } 
    //get all values 
     this.getValues = function(){ 
      var values = new Array(); 
      for(var prop in entry){ 
       values.push(entry[prop]); 
      } 
      return values; 
     } 
    //get all keys 
     this.getKeys = function(){ 
      var keys = new Array(); 
      for(var prop in entry){ 
       values.push(prop); 
      } 
      return keys; 
     } 
    this.getSize = function(){ 
     return size; 
    } 

    this.clear = function(){ 
     size = 0; 
     entry = new Object;//??????????????????? 
    } 
} 

var hashtest = new HashTable(); 
hashtest.add('name','LiMing'); 

あります私はJavaScriptでハッシュテーブルを実装したいが、それは私がこのような例外があり、JavaScriptでハッシュテーブルを実装したいが、私はそれをテスト例外

キャッチされないのReferenceErrorは:のcontainsKeyではありませんがHashTable.addで 定義(:8:3) で:64:代わりに10

+0

地図を見てみましょう。:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map – Akxe

+0

感謝の結果は次のようになります誠実にアドバイスをお願いします。 –

答えて

0

あなたは持っている問題はscopeの問題です。 javascriptインタプリタは、あなたがHashTableクラスのcontainsKeyを意味するのを知らない。

クラススコープ内で関数を呼び出す場合は、必ず「this」で参照してください。したがってcontainsKeythis.containsKey(key)と参照する必要があります。そうすれば、通訳者は、あなたがクラスのスコープではなく、ローカルスコープであることを知っていることを知っています。

これは、クラススコープの変数に対しても行う必要があります。したがって、size++を実行すると、実際にはthis.size++と記述する必要があります。 entryと同じです。 "this"を追加しないと、それはその関数内で定義されたローカル関数または変数であるとみなされます。

this.add = function(key,value){ 
     if(!this.containsKey(key)){ 
      this.size++; 
     } 
     this.entry[key] = value; 
    } 

は、なぜあなたは手動でとにかくサイズを追跡しているように、あなたのアドオン()関数を書き換える必要がありますか?単純に配列として "entry"を定義し、this.entry.sizeを使用することができます。

ハッシュマップのより具体的なケースを考えると、オブジェクト内に2つの配列を作成するだけです値を指定すると、組み込みのJavascript配列関数を単純に使用できるため、問題が大幅に単純化されます。どちらの配列も数値インデックスを持ちますが、キーと値の両方が常に同じインデックスを持ち、簡単に数学的に計算できます。

function HashTable() { 
 
    this.keys = new Array(); 
 
    this.values = new Array(); 
 

 
    this.add = function(key, value) { 
 

 
    if (this.containsKey(key)) { 
 
     var index = this.keys.indexOf(key); 
 
     this.values[index] = value; 
 
    } else { 
 
     this.keys.push(key); 
 
     this.values.push(value); 
 
    } 
 
    } 
 

 
    this.containsKey = function(key) { 
 
    return this.keys.includes(key); 
 
    } 
 

 
    this.containsValue = function(value) { 
 
    return this.values.includes(value); 
 
    } 
 

 
    this.get = function(key) { 
 
    var index = this.keys.indexOf(key); 
 
    return this.values[index]; 
 
    } 
 

 
    this.remove = function(key) { 
 
    if (this.containsKey(key)) { 
 
     var index = this.keys.indexOf(key); 
 
     this.keys.splice(index, 1); 
 
     this.values.splice(index, 1); 
 
    } 
 
    } 
 

 
    this.size = function() { 
 
    return this.keys.length; 
 
    } 
 

 
    this.clear = function() { 
 
    this.keys = new Array(); 
 
    this.values = new Array(); 
 
    } 
 
} 
 

 
// Create hashtable 
 
var hashTable = new HashTable(); 
 

 
// Add some test data 
 
hashTable.add('name', 'LiMing'); 
 
hashTable.add('location', 'At home'); 
 
hashTable.add('eyes', 'blue'); 
 

 
// Updates the value, doesn't add it 
 
hashTable.add('eyes', 'brown'); 
 
console.log(hashTable.get("eyes")); 
 

 
// Get the size 
 
console.log(hashTable.size()); 
 

 
// Check if a value or key is in the hashtable 
 
console.log(hashTable.containsValue("test")); // False 
 
console.log(hashTable.containsValue("LiMing")); // True 
 
console.log(hashTable.containsKey("name")); // True 
 
console.log(hashTable.containsKey("age")); // False 
 

 
// Get all the keys and values 
 
console.log(hashTable.keys); 
 
console.log(hashTable.values); 
 

 
// Remove an item 
 
hashTable.remove('eyes'); 
 
console.log(hashTable.keys); 
 
console.log(hashTable.values); 
 

 
// Clear hashtable 
 
hashTable.clear(); 
 
console.log(hashTable.keys); 
 
console.log(hashTable.values);

+0

あなたの答えに心から感謝しています:) –

+0

"entry"を配列として定義する場合、そのキーはちょうど数字のタイプです。 申し訳ありませんが、私の英語は貧しいので、トーンがひどい場合は、私を許してください。 –

+0

これは本当ですが、Javascriptは連想配列(https:// www。w3schools.com/js/js_arrays.asp)。 しかし、私はあなたのオブジェクトに2つの配列、キーを持つ配列、および値を持つ別の配列を持つようアドバイスします。 –

0

使用this.containsKeycontainsKeyHashTableによって作成されたオブジェクト内の 'メンバー' 方法であるとして、あなたがthisとそれを参照しなければなりません。

function HashTable(){ 
 
    var size = 0; 
 
    var entry = new Object(); 
 
    
 
    this.containsValue = function(value){ 
 
     for(var prop in entry){ 
 
      if(entry[prop] == value){ 
 
       return true; 
 
      } 
 
     } 
 
     return false; 
 
    } 
 
    
 
    this.add = function(key,value){ 
 
     if(!this.containsKey(key)){ 
 
      size++; 
 
     } 
 
     entry[key] = value; 
 
    } 
 

 
this.getValue = function(key){ 
 
    return this.containsKey(key)?entry[key]:null; 
 
} 
 

 
this.remove = function(key){ 
 
    if (this.containsKey(key) && delete entry[key]) { 
 
     size--; 
 
    } 
 
} 
 

 
this.containsKey = function(key){ 
 
    return (key in entry); 
 
} 
 

 

 
//get all values 
 
    this.getValues = function(){ 
 
     var values = new Array(); 
 
     for(var prop in entry){ 
 
      values.push(entry[prop]); 
 
     } 
 
     return values; 
 
    } 
 
//get all keys 
 
    this.getKeys = function(){ 
 
     var keys = new Array(); 
 
     for(var prop in entry){ 
 
      values.push(prop); 
 
     } 
 
     return keys; 
 
    } 
 
this.getSize = function(){ 
 
    return size; 
 
} 
 

 
this.clear = function(){ 
 
    size = 0; 
 
    entry = new Object;//??????????????????? 
 
} 
 
} 
 

 
var hashtest = new HashTable(); hashtest.add('name','LiMing'); 
 
console.log(hashtest.getValues())

ES6を使用してコードを整理する良い方法があります:

class HashTable { 
 
    constructor() { 
 
    this.size = 0; 
 
    this.entry = new Object(); 
 
    } 
 
    
 
    containsValue(value) { 
 
    for(var prop in entry){ 
 
     if(this.entry[prop] == value){ 
 
     return true; 
 
     } 
 
    } 
 
    return false; 
 
    } 
 
    
 
    add(key,value) { 
 
    if(!this.containsKey(key)){ 
 
     this.size++; 
 
    } 
 
    this.entry[key] = value; 
 
    } 
 
    
 
    getValue(key) { 
 
    return this.containsKey(key) ? this.entry[key] : null; 
 
    } 
 
    
 
    remove(key) { 
 
    if (this.containsKey(key) && delete this.entry[key]) { 
 
     size--; 
 
    } 
 
    } 
 
    
 
    containsKey(key) { 
 
    return (key in this.entry); 
 
    } 
 
    
 
    //get all values 
 
    getValues() { 
 
    var values = new Array(); 
 
    for(var prop in this.entry){ 
 
     values.push(this.entry[prop]); 
 
    } 
 
    return values; 
 
    } 
 
    
 
    //get all keys 
 
    getKeys() { 
 
    var keys = new Array(); 
 
    for(var prop in this.entry){ 
 
     values.push(prop); 
 
    } 
 
    return keys; 
 
    } 
 
    
 
    getSize() { 
 
    return this.size; 
 
    } 
 
    
 
    clear() { 
 
    this.size = 0; 
 
    this.entry = new Object();//??????????????????? 
 
    } 
 
    
 
} 
 

 

 
var hashtest = new HashTable(); hashtest.add('name','LiMing'); 
 
console.log(hashtest.getValues())

+0

そしてthis.entryともっと多くのこと、そしてネイティブのMap実装について書き留めておいてください。 – Akxe

+0

ありがとうございました! –

関連する問題