今回はJSでハッシュテーブルを作成する関数についてお届けします。JSを使用してハッシュテーブル関数を作成する際の注意点を実際のケースで見てみましょう。
アルゴリズム、特に配列に関連するアルゴリズムでは、ハッシュ テーブルを使用すると問題を非常にうまく解決できるため、この記事では js でのハッシュ テーブルの実装をいくつか記録し、実際的な問題を解決する例を示します。
注: この記事は実際にはハッシュ テーブルに関するものではなく、ハッシュ テーブルの使用方法に似ているだけです。
パート 1: 関連する知識ポイント
プロパティの列挙:
var person = { name: "zzw", sex: "Male", age: 21 }; for (var prop in person) { console.log(prop + " ",person[prop]); }
出力:
つまり、オブジェクトの場合、 for in を使用してオブジェクトのプロパティを列挙できます。
属性の削除:
var person = { name: "zzw", sex: "Male", age: 21 }; var ifRemove = delete person.name; for (var prop in person) { console.log(prop + " ",person[prop]); } console.log(ifRemove);
オブジェクトの属性は delete によって削除でき、戻り値が返されます。 以下の通り:
注: 通常、削除できるのはオブジェクトの属性のみですが、次のような変数は削除できません。
var x = 1; console.log(delete x);
このとき、変数は削除できないため、プリント ステーションは false を出力します。
属性が存在するかどうかを検出します:
var person = { name: "zzw", sex: "Male", age: 21 }; console.log("age" in person); console.log("someOther" in person);
前者は true を返し、後者は false を返します。 つまり、 in を使用して、オブジェクトにこの属性が含まれているかどうかを判断できます。
属性の追加:
var person = { name: "zzw", sex: "Male", age: 21 }; person["school"] = "XJTU"; console.log(person);
属性の追加は非常に簡単です。上に示したように、最終的に印刷されるオブジェクトには school 属性が含まれます。
パート 2: js を使用してハッシュ テーブルを実装する
以下は、コンストラクター を介して取得されたハッシュ テーブルであり、使用する場合は、それをインスタンス化するだけで済み、以下の関数は比較的豊富です。練習問題では、それを選択的に使用できます。
// 创建构造函数HashTable function HashTable() { // 初始化哈希表的记录条数size var size = 0; // 创建对象用于接受键值对 var res = {}; // 添加关键字,无返回值 this.add = function (key, value) { //判断哈希表中是否存在key,若不存在,则size加1,且赋值 if (!this.containKey(key)) { size++; } // 如果之前不存在,赋值; 如果之前存在,覆盖。 res[key] = value; }; // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一个布尔值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一个布尔值 this.containValue = function (value) { // 遍历对象中的属性值,判断是否和给定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根据键获取value,如果不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 获取哈希表中的所有value, 返回一个数组 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根据值获取哈希表中的key,如果不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍历结束没有return,就返回null return null; }; // 获取哈希表中所有的key,返回一个数组 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 获取哈希表中记录的条数,返回一个数值 this.getSize = function () { return size; }; // 清空哈希表,无返回值 this.clear = function () { size = 0; res = {}; }; }
パート 3: アプリケーション例
問題: 整数の配列 (順序なし) が与えられ、その合計が指定された値になるようにその中から 2 つの数値を見つけて、これら 2 つの数値を返します。数値の添え字 (配列の添字は 0 から始まります)、配列要素の値が異なることを前提としています。
実装は以下の通りです:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>哈希表的使用</title> </head> <body> <script> function queryIndex(arr, result) { var hashTable = new HashTable(); var arrLength = arr.length; var sub = []; for (var i = 0; i < arrLength; i++) { // 扫描一遍,存储下标和值 hashTable.add(i, arr[i]); } for (var j = 0; j < arrLength; j++) { if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) { // 获取两个下标,跳出循环 sub.push(j); var antherIndex = Number(hashTable.getKey(result - arr[j])); sub.push(antherIndex); break; } } if (sub.length !== 0) { return sub; } else { return -1; } } console.log(queryIndex([1,5,7,3,8], 15)); // 2, 4 console.log(queryIndex([8,18,28,12,29,17], 46)); // 2, 4 console.log(queryIndex([8,18,28,12,29,17], 2)); // -1 // 创建构造函数HashTable function HashTable() { // 初始化哈希表的记录条数size var size = 0; // 创建对象用于接受键值对 var res = {}; // 添加关键字,无返回值 this.add = function (key, value) { //判断哈希表中是否存在key,若不存在,则size加1,且赋值 if (!this.containKey(key)) { size++; } // 如果之前不存在,赋值; 如果之前存在,覆盖。 res[key] = value; }; // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一个布尔值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一个布尔值 this.containValue = function (value) { // 遍历对象中的属性值,判断是否和给定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根据键获取value,如果不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 获取哈希表中的所有value, 返回一个数组 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根据值获取哈希表中的key,如果不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍历结束没有return,就返回null return null; }; // 获取哈希表中所有的key,返回一个数组 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 获取哈希表中记录的条数,返回一个数值 this.getSize = function () { return size; }; // 清空哈希表,无返回值 this.clear = function () { size = 0; res = {}; }; } </script> </body> </html>
実際の使用プロセスでは、最初に主要な関数を記述し、必要に応じて追加することができます。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
マウスと画像間のインタラクティブな拡大効果を実現するための JS+CSS3
jQuery.i18n に基づいた Web フロントエンドの国際化の実装
以上がJSでハッシュテーブル関数を作るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。