জাভাস্ক্রিপ্টে কীভাবে এসোসিয়েটিভ অ্যারে / হ্যাশিং করবেন


574

আমি জাভাস্ক্রিপ্ট ব্যবহার করে কিছু পরিসংখ্যান এমনভাবে সঞ্চয় করতে চাই যে আমি এটি সি # তে করতাম:

Dictionary<string, int> statistics;

statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);

জাভাস্ক্রিপ্টে এর Hashtableমতো কিছু আছে কি Dictionary<TKey, TValue>?
আমি কীভাবে এইভাবে মান সংরক্ষণ করতে পারি?


1
জেএস শিথিলভাবে টাইপ করা হয়েছে, সুতরাং কেবল স্ট্রিং বা ইন্ট ঘোষণা করার কোনও উপায় নেই, আপনি কেবল একটি ভের ঘোষণা করতে পারেন এবং এটিকে একটি স্ট্রিং বা ইনট নির্ধারণ করতে পারেন। : ডি
গর্ডন গুস্তাফসন

আপনি এক্সডিক্ট পরীক্ষা করে দেখতে চাইতে পারেন। jsfiddle.net/very/MuVwd এটি একটি অভিধান স্ট্রিং => জাভাস্ক্রিপ্টে লিখিত কিছু।
রবার্ট

এই নিবন্ধটিতে জাভাস্ক্রিপ্ট jayconrod.com/posts/52/a-tour-of-v8-object-
বিবৃতিতে

স্বীকৃত উত্তরটি ২০০৯ সালে লেখা হয়েছিল - এটি কেবল স্ট্রিং কীগুলিকে সমর্থন করে । স্ট্রিং -হীন কীগুলির জন্য, ভিটালির উত্তর হিসাবে ম্যাপ বা উইকম্যাপ ব্যবহার করুন
টুলমেকারস্টেভ

উত্তর:


564

সহযোগী অ্যারে হিসাবে জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করুন ।

সহযোগী অ্যারে: সরল কথায় এসোসিয়েটিভ অ্যারে সূচি হিসাবে পূর্ণসংখ্যার সংখ্যার পরিবর্তে স্ট্রিং ব্যবহার করে।

দিয়ে একটি অবজেক্ট তৈরি করুন

var dictionary = {};

জাভাস্ক্রিপ্ট আপনাকে নিম্নলিখিত সিনট্যাক্স ব্যবহার করে অবজেক্টগুলিতে বৈশিষ্ট্য যুক্ত করতে দেয়:

Object.yourProperty = value;

এর জন্য একটি বিকল্প বাক্য গঠন:

Object["yourProperty"] = value;

আপনি যদি নিম্নলিখিত সিনট্যাক্সের সাথে মান মানের কী তৈরি করতে পারেন

var point = { x:3, y:2 };

point["x"] // returns 3
point.y // returns 2

নিম্নরূপে for..in লুপ কনস্ট্রাক্ট ব্যবহার করে আপনি কোনও এসোসিয়েটিভ অ্যারের মাধ্যমে পুনরাবৃত্তি করতে পারেন

for(var key in Object.keys(dict)){
  var value = dict[key];
  /* use key/value for intended purpose */
}

36
নোট করুন যে একটি "সহযোগী অ্যারে" এর সাথে লেখার new Array()সূচনাটি ভ্রান্ত হয়েছে। নিবন্ধটি শেষ পর্যন্ত এর অসুবিধাগুলি এবং পরামর্শগুলি new Object()বা {}পছন্দসই বিকল্প হিসাবে উল্লেখ করেছে , তবে এটি শেষের কাছাকাছি এবং আমি আশঙ্কা করছি যে বেশিরভাগ পাঠকরা এ পর্যন্ত পাবেন না।
ড্যানিয়েল লুবারভ

23
ব্যর্থ হয়। জাভাস্ক্রিপ্ট কী হিসাবে বস্তুর উল্লেখগুলি সমর্থন করে না, যখন ফ্ল্যাশ / এএস 3 অভিধানের মতো কিছু করে। জাভাস্ক্রিপ্টে, var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays Bকারণ এটি কী ওজ 1 এবং অজ 2 এর মধ্যে পার্থক্য করতে পারে না; তারা উভয় স্ট্রিংয়ে রূপান্তরিত হয়েছে এবং কেবল "অবজেক্ট" এর মতো কিছু হয়ে যায়। মোট ব্যর্থ হয়েছে, এবং জাভাস্ক্রিপ্টে রেফারেন্স এবং সাইক্লিক-রেফারেন্সগুলি অক্ষত কঠিন বা অ-অভিনয় হিসাবে টাইপ-নিরাপদ সিরিয়ালাইজেশন তৈরি করে। এটি ফ্ল্যাশ / এএস 3-তে সহজ।
ট্রায়ঙ্কো

ঠিক আছে, জেএসের একমাত্র উপায় আমরা সাম্যতা যাচাই বা সমান পদ্ধতিটি এই জাতীয় কোনও দ্বারা সংজ্ঞায়িত করে প্রমাণ করতে পারি: Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
নাদিম

1
@ লিও কনসোল.লগ ({এ: 'বি', সি: 'ডি'} [
ফুও

2
@ লিও উদাহরণটি ভুল বলে মনে হচ্ছে। for... inঅভিধানের জন্য এর কীগুলি লুপ হয়ে যাবে, সুতরাং Object.keysসেখানে malp বাস্তবে মনে হচ্ছে। Object.keysঅভিধানের কীগুলির একটি অ্যারে প্রদান করে এবং for... inএকটি অ্যারের জন্য তার "কীগুলি" উপরে লুপ করে , যা অ্যারের জন্য এটির সূচক হয়, এর মানগুলি নয়।
জেএইচ এইচ

434
var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

আপনি যদি কোনও অবজেক্ট-ভিত্তিক ভাষা থেকে আসেন তবে আপনার এই নিবন্ধটি পরীক্ষা করা উচিত ।


38
আপনি এটি কম লাইনগুলিতেও করতে পারেন: var এসোসিয়েটিভআরাই = one "এক": "প্রথম", "দুই": "দ্বিতীয়", "তিন": "তৃতীয়"}; তারপরে এসোসিয়েটিভআরাই ["এক"] "প্রথম" এবং এসোসিয়েটিভ অ্যারে ["চার"] ফিরে আসে।
টনি উইকহাম

2
দুঃখিত @ জুসো ওহটনেন, আমি 6 বছর আগে পোস্টটি লিখেছিলাম (এটি অবিশ্বাস্য যে কত দ্রুত সময় কেটে যায়)। আমি লিঙ্কটি আপডেট করেছি। দয়া করে এটি পরীক্ষা করে নিন এবং আপনার কোনও সন্দেহ আছে কিনা তা জিজ্ঞাসা করতে দ্বিধা করবেন না
ড্যানি ক্রিকো

145

সমস্ত আধুনিক ব্রাউজার একটি জাভাস্ক্রিপ্ট মানচিত্র অবজেক্ট সমর্থন করে । কয়েকটি কারণ রয়েছে যা মানচিত্রকে অবজেক্টের চেয়ে আরও ভাল করে তোলে:

  • একটি অবজেক্টের একটি প্রোটোটাইপ রয়েছে, তাই মানচিত্রে ডিফল্ট কী রয়েছে।
  • কোনও অবজেক্টের কীগুলি স্ট্রিংস, যেখানে সেগুলি মানচিত্রের যে কোনও মান হতে পারে।
  • আপনাকে কোনও অবজেক্টের জন্য আকারের ট্র্যাক রাখতে হবে এমন সময় আপনি সহজেই মানচিত্রের আকার পেতে পারেন।

উদাহরণ:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

আপনি যদি এমন কীগুলি চান যা অন্য বস্তু থেকে রেফারেন্সযুক্ত না হয় আবর্জনা সংগ্রহের জন্য, মানচিত্রের পরিবর্তে উইকম্যাপ ব্যবহার করার বিষয়টি বিবেচনা করুন ।


5
আশা করি কয়েক বছরের মধ্যে এটি উত্তরের পক্ষে সবচেয়ে বেশি ভোট হবে।
ক্যামেরন লি

1
@ ক্যামেরনএটি অবশ্যই তা করবে
Loïc Faure-Lacroix

1
এটি Mapসবেমাত্র কার্যকর যখন আপনার কীটি কোনও বস্তু হয় তবে মান দ্বারা তুলনা করা উচিত, রেফারেন্স নয়।
সিয়ুয়ান রেন

7
এই উত্তরটি লেখার এক বছরেরও বেশি সময় পরেও এটি সত্য নয় যে "সমস্ত আধুনিক ব্রাউজারগুলি মানচিত্রকে সমর্থন করে।" কেবলমাত্র ডেস্কটপে আপনি কমপক্ষে বেসিক মানচিত্র সমর্থনটি গণনা করতে পারেন। মোবাইল ডিভাইসে নেই। যেমন, অ্যান্ড্রয়েড ব্রাউজারের কোনও মানচিত্র সমর্থন নেই। এমনকি ডেস্কটপেও কিছু বাস্তবায়ন অসম্পূর্ণ। উদাহরণস্বরূপ, আইই 11 এখনও "এর ... এর ..." এর মাধ্যমে গণনা সমর্থন করে না, সুতরাং আপনি যদি আই সামঞ্জস্য চান তবে আপনাকে ঘৃণ্যকর। প্রতিটি ক্লডেজ ব্যবহার করতে হবে। এছাড়াও, JSON.stringify () আমি চেষ্টা করেছি এমন কোনও ব্রাউজারে মানচিত্রের জন্য কাজ করে না। এছাড়াও প্রারম্ভিকরা আইই বা সাফারিতে কাজ করে না।
ডেভ বার্টন

3
এখানে দুর্দান্ত ব্রাউজার সমর্থন রয়েছে। আবার পরীক্ষা করুন. যাই হোক না কেন, এটি পলিফিল করা বেশ সহজ, সুতরাং নেটিভ ব্রাউজার সমর্থন একটি ইস্যু নয়।
ব্র্যাড

132

আপনার না করার একটি নির্দিষ্ট কারণ না থাকলে কেবল একটি সাধারণ অবজেক্ট ব্যবহার করুন। জাভাস্ক্রিপ্টে অবজেক্টের বৈশিষ্ট্যগুলি হ্যাশটেবল-স্টাইল সিনট্যাক্স ব্যবহার করে উল্লেখ করা যেতে পারে:

var hashtable = {};
hashtable.foo = "bar";
hashtable['bar'] = "foo";

উভয় fooএবং barউপাদান উভয় এখন হিসাবে উল্লেখ করা যেতে পারে:

hashtable['foo'];
hashtable['bar'];
// or
hashtable.foo;
hashtable.bar;

অবশ্যই এর অর্থ আপনার কীগুলি স্ট্রিং হওয়া দরকার। তারা যদি স্ট্রিং না হয় তবে তারা অভ্যন্তরীণভাবে স্ট্রিংয়ে রূপান্তরিত হয়, তাই এটি এখনও কার্যকর হতে পারে, ওয়াইএমএমভি।


1
পূর্ণসংখ্যা হিসাবে কীগুলি আমাকে কোনও সমস্যা করে না। stackoverflow.com/questions/2380019/…
জোনাস এলফস্ট্রোম

10
জোনাস: মনে রাখবেন যে সম্পত্তিটি সেট করার সময় আপনার পূর্ণসংখ্যার স্ট্রিংগুলিতে রূপান্তরিত হয়: var hash = {}; hash[1] = "foo"; alert(hash["1"]);সতর্কতা "foo"।
টিম ডাউন

17
যদি আপনার কীগুলির মধ্যে একটি " প্রোটো " বা " পিতামাতা " হয়?
প্লিজ স্ট্যান্ড

5
নোট করুন যে জাভাস্ক্রিপ্টে কী হিসাবে অবজেক্টগুলি ব্যবহার করা যাবে না । ঠিক আছে, তারা পারেন তবে তারা তাদের স্ট্রিং উপস্থাপনায় রূপান্তরিত হয়েছে, সুতরাং যে কোনও অবজেক্টটি ঠিক একই কী হিসাবে শেষ হবে। নীচে @ টিমডাউন এর জ্যাশটেবল পরামর্শ দেখুন।
এরিকোসো

21
এই উদাহরণটি বিভ্রান্তিকর কারণ আপনি দুটি উদাহরণে কী এবং মান উভয় হিসাবে foo এবং বার ব্যবহার করছেন। var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";ডিকের কী 1 উপাদানটি উভয়ের দ্বারা সমতুল্য উল্লেখ করা যেতে পারে dict["key1"]এবং তা বোঝানোর জন্য আরও পরিষ্কার dict.key1
জিম

49

যেহেতু জেএসের প্রতিটি বস্তু যেমন আচরণ করে - এবং সাধারণত হিসাবে প্রয়োগ করা হয় - একটি হ্যাশটেবল, আমি কেবল তার সাথে যাই ...

var hashSweetHashTable = {};

26
ডাউনভোটেড কারণ এটি "হ্যাশটেবল"-তে কীভাবে মানগুলি অ্যাক্সেস করতে পারে তা দেখায় না।
আইকিউআন্দ্রেয়াস

আমি 9 বছর দেরী (প্রোগ্রামিং সম্পর্কে আমি খুব বেশি কিছু জানতাম না, এই সাইটটিকে আবার ছেড়ে দেই), তবে ... আপনি যদি কোনও মানচিত্রে পয়েন্ট সংরক্ষণের চেষ্টা করছেন এবং কিছু ইতিমধ্যে আছে কিনা তা দেখার দরকার নেই একটি মানচিত্রের এক পর্যায়ে? সেক্ষেত্রে, আপনি সেরা হবে, এই জন্য hashtable ব্যবহার (একটি স্থানাঙ্ক দ্বারা আপ খুঁজছেন বস্তুর , না একটি স্ট্রিং )।
মাইক ওয়ারেন

if (hashSweetHashTable.foo)যদি fooসেট করা থাকে তবে মাইকওয়ারেনের যদি ব্লকটি প্রবেশ করতে হবে ।
Koray Tugay

21

সুতরাং সি # কোডটি দেখতে মনে হচ্ছে:

Dictionary<string,int> dictionary = new Dictionary<string,int>();
dictionary.add("sample1", 1);
dictionary.add("sample2", 2);

অথবা

var dictionary = new Dictionary<string, int> {
    {"sample1", 1},
    {"sample2", 2}
};

জাভাস্ক্রিপ্টে

var dictionary = {
    "sample1": 1,
    "sample2": 2
}

C # এর অভিধান বস্তুর মত দরকারী পদ্ধতি রয়েছে dictionary.ContainsKey() জাভাস্ক্রিপ্ট আমরা ব্যবহার করতে পারে hasOwnPropertyমত

if (dictionary.hasOwnProperty("sample1"))
    console.log("sample1 key found and its value is"+ dictionary["sample1"]);

1
আমার সম্পর্কে উত্তর লিখতে হবে না বলে hasOwnProperty
আপভোট করুন

18

যদি আপনার কীগুলি কেবল স্ট্রিংয়ের পরিবর্তে কোনও বস্তু হওয়ার প্রয়োজন হয় তবে আপনি আমার জ্যাশটেবল ব্যবহার করতে পারেন ।


3
আমি এটি আবিষ্কার করার আগে জেএস-স্টাইল-অবজেক্ট-অ্যাজ-এসোসিয়েটিভ-অ্যারেগুলির জন্য কীগুলি অবজেক্টগুলি সত্যই কী হিসাবে ব্যবহার করা যায় না এই বিষয়টি নিয়ে আমি কত ঘন্টা হোঁচট খেয়েছি? ধন্যবাদ, টিম।
এরিকোসো

1
ফ্ল্যাশ / এএস 3 অভিধান, অন্যান্য বেশিরভাগ ভাষার সাথে, কী হিসাবে অবজেক্টের রেফারেন্সকে সমর্থন করে। জাভাস্ক্রিপ্ট এখনও এটি বাস্তবায়িত হয়নি, তবে আমি মনে করি এটি কোনও ভবিষ্যতের বৈশিষ্ট্যে কিছু ধরণের মানচিত্র শ্রেণি হিসাবে রয়েছে। এর মধ্যে আবার পলিফিলস নিয়ে; মান জন্য এত। ওহ, অপেক্ষা করুন ... অবশেষে ২০১৫ সালে, মানচিত্রটি উপস্থিত হয়েছে বলে মনে হচ্ছে: stackoverflow.com/a/30088129/88409 , এবং এটি "আধুনিক" ব্রাউজারগুলি দ্বারা সমর্থিত, লোল: কাঙ্গাক্সস.github.io/compat-table/es6/# মানচিত্র (এবং সত্যই বহুল সমর্থনযোগ্য নয়)। এএস 3 এর পিছনে কেবল এক দশক।
ট্রায়ঙ্কো

টিম, সম্ভবত আপনার কাছে ম্যাপ () উপলভ্য থাকার জন্য জ্যাশটেবল আপডেট করা উচিত।
ডেভ বার্টন

1
@ ডেভবার্টন: ভাল পরিকল্পনা। আমার কিছু সময় হওয়ার সাথে সাথে আমি এটি করব।
টিম ডাউন

6
function HashTable() {
    this.length = 0;
    this.items = new Array();
    for (var i = 0; i < arguments.length; i += 2) {
        if (typeof (arguments[i + 1]) != 'undefined') {
            this.items[arguments[i]] = arguments[i + 1];
            this.length++;
        }
    }

    this.removeItem = function (in_key) {
        var tmp_previous;
        if (typeof (this.items[in_key]) != 'undefined') {
            this.length--;
            var tmp_previous = this.items[in_key];
            delete this.items[in_key];
        }

        return tmp_previous;
    }

    this.getItem = function (in_key) {
        return this.items[in_key];
    }

    this.setItem = function (in_key, in_value) {
        var tmp_previous;
        if (typeof (in_value) != 'undefined') {
            if (typeof (this.items[in_key]) == 'undefined') {
                this.length++;
            } else {
                tmp_previous = this.items[in_key];
            }

            this.items[in_key] = in_value;
        }

        return tmp_previous;
    }

    this.hasItem = function (in_key) {
        return typeof (this.items[in_key]) != 'undefined';
    }

    this.clear = function () {
        for (var i in this.items) {
            delete this.items[i];
        }

        this.length = 0;
    }
}

1
এই ভোটাধিকারী লোকদের জন্য, আপনি দয়া করে কেন মন্তব্য করতে পারেন? এই উত্তরটি ২০১১ সালে পোস্ট করা হয়েছিল এবং বর্তমান তারিখে নয়।
বিরে

2
আমি ভোট কম নিইনি তবে ... আপনাকে কোনও বস্তু হিসাবে অ্যারে ব্যবহার করা উচিত নয়। এটি যদি আপনার উদ্দেশ্য ছিল তবে 100% নিশ্চিত নয়। পুনরায় সূচকের জন্য মুছে ফেলা হয়নি অ্যারেগুলিতে স্লাইস ব্যবহার করুন; মুছুন ঠিক আছে তবে নির্ধারিততে সেট করা হবে - সুস্পষ্ট হওয়া ভাল; ব্যবহার = একটি অবজেক্টে অপরিজ্ঞাত খুব বি / সি এটি দ্রুত (তবে আরও স্মৃতি)। সংক্ষেপে: সর্বদা একটি বস্তুটি ব্যবহার করুন: {}একটি অ্যারে নয়: []অথবা new Array()আপনি যদি স্ট্রিং কীগুলি ব্যবহার করতে চান অন্যথায় জেএস ইঞ্জিনের সমস্যা আছে - এটি হয় 1 টি ভেরিয়েবলের জন্য 2 প্রকারের যার অর্থ অপ্টিমাইজেশন নয় এটি অ্যারে দিয়ে চালিত হবে এবং উপলব্ধি করবে এটি অবজেক্টে পরিবর্তন করতে হবে (সম্ভাব্য পুনরায় বরাদ্দ)।
গ্রিম উইকসটেড

2
অ্যালেক্স হকিন্সের উত্তরের মতোই, দয়া করে এখানে বর্ণিত অন্যান্য সংক্ষিপ্ত উত্তরের তুলনায় এই জটিল জটিল কোডটি আসলে কার্যকর এবং কেন ভাল তা দয়া করে কিছু ব্যাখ্যা সরবরাহ করুন।
টমাস টেম্পেলম্যান

6

আমি কিছু সমস্যা অর্জনের জন্য এটি তৈরি করেছি, যেমন অবজেক্ট কী ম্যাপিং, গণনার ক্ষমতা ( forEach()পদ্ধতি সহ) এবং ক্লিয়ারিং।

function Hashtable() {
    this._map = new Map();
    this._indexes = new Map();
    this._keys = [];
    this._values = [];
    this.put = function(key, value) {
        var newKey = !this.containsKey(key);
        this._map.set(key, value);
        if (newKey) {
            this._indexes.set(key, this.length);
            this._keys.push(key);
            this._values.push(value);
        }
    };
    this.remove = function(key) {
        if (!this.containsKey(key))
            return;
        this._map.delete(key);
        var index = this._indexes.get(key);
        this._indexes.delete(key);
        this._keys.splice(index, 1);
        this._values.splice(index, 1);
    };
    this.indexOfKey = function(key) {
        return this._indexes.get(key);
    };
    this.indexOfValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.get = function(key) {
        return this._map.get(key);
    };
    this.entryAt = function(index) {
        var item = {};
        Object.defineProperty(item, "key", {
            value: this.keys[index],
            writable: false
        });
        Object.defineProperty(item, "value", {
            value: this.values[index],
            writable: false
        });
        return item;
    };
    this.clear = function() {
        var length = this.length;
        for (var i = 0; i < length; i++) {
            var key = this.keys[i];
            this._map.delete(key);
            this._indexes.delete(key);
        }
        this._keys.splice(0, length);
    };
    this.containsKey = function(key) {
        return this._map.has(key);
    };
    this.containsValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.forEach = function(iterator) {
        for (var i = 0; i < this.length; i++)
            iterator(this.keys[i], this.values[i], i);
    };
    Object.defineProperty(this, "length", {
        get: function() {
            return this._keys.length;
        }
    });
    Object.defineProperty(this, "keys", {
        get: function() {
            return this._keys;
        }
    });
    Object.defineProperty(this, "values", {
        get: function() {
            return this._values;
        }
    });
    Object.defineProperty(this, "entries", {
        get: function() {
            var entries = new Array(this.length);
            for (var i = 0; i < entries.length; i++)
                entries[i] = this.entryAt(i);
            return entries;
        }
    });
}


ক্লাসের ডকুমেন্টেশন Hashtable

পদ্ধতি:

  • get(key)
    নির্দিষ্ট কীটির সাথে সম্পর্কিত মান প্রদান করে।
    পরামিতি::
    key কীটি থেকে মানটি পুনরুদ্ধার করে।

  • put(key, value)
    নির্দিষ্ট কীটিকে নির্দিষ্ট মানটি সংযুক্ত করে।
    পরামিতি::
    key মানটি সংযুক্ত করার জন্য কী।
    value: কীটি সংযুক্ত করার মান।

  • remove(key)
    নির্দিষ্ট মানটিকে এর মান সহ সরিয়ে দেয়।
    পরামিতি::
    key মুছে ফেলার কী।

  • clear()
    কী এবং মান উভয়ই সরিয়ে সমস্ত হ্যাশটেবল সাফ করে।

  • indexOfKey(key)
    সংযুক্তি ক্রমের ভিত্তিতে নির্দিষ্ট কীটির সূচক ফেরত দেয়।
    পরামিতি::
    key সূচকটি প্রাপ্ত করার মূল কী।

  • indexOfValue(value)
    যোগ করার ক্রমের উপর ভিত্তি করে নির্দিষ্ট মানটির সূচক ফেরত দেয়।
    পরামিতি::
    value যেটির সূচকটি পাওয়া যায়।
    নোটস:
    এই তথ্যটি indexOf()একটি অ্যারের পদ্ধতিতে পুনরুদ্ধার করা হয়েছে , সুতরাং এটি কেবল toString()পদ্ধতির সাথে বস্তুর তুলনা করে ।

  • entryAt(index)
    দুটি বৈশিষ্ট্যযুক্ত একটি বস্তু ফেরত দেয়: কী এবং মান, নির্দিষ্ট সূচীতে প্রবেশের প্রতিনিধিত্ব করে।
    পরামিতি::
    index প্রবেশের সূচকটি পেতে।

  • containsKey(key)
    হ্যাশটেবলে নির্দিষ্ট কী রয়েছে কিনা তা ফেরত দেয়।
    পরামিতি::
    key চেক করার জন্য কী।

  • containsValue(value)
    হ্যাশটেবলে নির্দিষ্ট মান রয়েছে কিনা তা প্রদান করে।
    পরামিতি::
    value পরীক্ষা করার মান।

  • forEach(iterator)
    উল্লিখিত সমস্ত এন্ট্রি Iterates iterator
    পরামিতি:
    value :: 3 পরামিতি সঙ্গে একটি পদ্ধতি key, valueএবং index, যেখানে indexএন্ট্রির সূচক প্রতিনিধিত্ব করে।

    বিশিষ্টতা:

  • length ( কেবলমাত্র পঠনযোগ্য )
    হ্যাশটেবলে প্রবেশের গণনা পাওয়া যায়।

  • keys ( কেবলমাত্র পঠনযোগ্য )
    হ্যাশটেবলের সমস্ত কীগুলির একটি অ্যারে পাওয়া যায়।

  • values ( কেবলমাত্র পঠনযোগ্য )
    হ্যাশটেবলে সমস্ত মানের একটি অ্যারে পাওয়া যায়।

  • entries ( কেবলমাত্র পঠনযোগ্য )
    হ্যাশটেবলে সমস্ত এন্ট্রিগুলির একটি অ্যারে পাওয়া যায়। তারা পদ্ধতির একই আকারে প্রতিনিধিত্ব করছেন entryAt()


2

https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4

var HashTable = function() {
  this._storage = [];
  this._count = 0;
  this._limit = 8;
}


HashTable.prototype.insert = function(key, value) {
  //create an index for our storage location by passing it through our hashing function
  var index = this.hashFunc(key, this._limit);
  //retrieve the bucket at this particular index in our storage, if one exists
  //[[ [k,v], [k,v], [k,v] ] , [ [k,v], [k,v] ]  [ [k,v] ] ]
  var bucket = this._storage[index]
    //does a bucket exist or do we get undefined when trying to retrieve said index?
  if (!bucket) {
    //create the bucket
    var bucket = [];
    //insert the bucket into our hashTable
    this._storage[index] = bucket;
  }

  var override = false;
  //now iterate through our bucket to see if there are any conflicting
  //key value pairs within our bucket. If there are any, override them.
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      //overide value stored at this key
      tuple[1] = value;
      override = true;
    }
  }

  if (!override) {
    //create a new tuple in our bucket
    //note that this could either be the new empty bucket we created above
    //or a bucket with other tupules with keys that are different than 
    //the key of the tuple we are inserting. These tupules are in the same
    //bucket because their keys all equate to the same numeric index when
    //passing through our hash function.
    bucket.push([key, value]);
    this._count++
      //now that we've added our new key/val pair to our storage
      //let's check to see if we need to resize our storage
      if (this._count > this._limit * 0.75) {
        this.resize(this._limit * 2);
      }
  }
  return this;
};


HashTable.prototype.remove = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];
  if (!bucket) {
    return null;
  }
  //iterate over the bucket
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    //check to see if key is inside bucket
    if (tuple[0] === key) {
      //if it is, get rid of this tuple
      bucket.splice(i, 1);
      this._count--;
      if (this._count < this._limit * 0.25) {
        this._resize(this._limit / 2);
      }
      return tuple[1];
    }
  }
};



HashTable.prototype.retrieve = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];

  if (!bucket) {
    return null;
  }

  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      return tuple[1];
    }
  }

  return null;
};


HashTable.prototype.hashFunc = function(str, max) {
  var hash = 0;
  for (var i = 0; i < str.length; i++) {
    var letter = str[i];
    hash = (hash << 5) + letter.charCodeAt(0);
    hash = (hash & hash) % max;
  }
  return hash;
};


HashTable.prototype.resize = function(newLimit) {
  var oldStorage = this._storage;

  this._limit = newLimit;
  this._count = 0;
  this._storage = [];

  oldStorage.forEach(function(bucket) {
    if (!bucket) {
      return;
    }
    for (var i = 0; i < bucket.length; i++) {
      var tuple = bucket[i];
      this.insert(tuple[0], tuple[1]);
    }
  }.bind(this));
};


HashTable.prototype.retrieveAll = function() {
  console.log(this._storage);
  //console.log(this._limit);
};

/******************************TESTS*******************************/

var hashT = new HashTable();

hashT.insert('Alex Hawkins', '510-599-1930');
//hashT.retrieve();
//[ , , , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Boo Radley', '520-589-1970');
//hashT.retrieve();
//[ , [ [ 'Boo Radley', '520-589-1970' ] ], , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Vance Carter', '120-589-1970').insert('Rick Mires', '520-589-1970').insert('Tom Bradey', '520-589-1970').insert('Biff Tanin', '520-589-1970');
//hashT.retrieveAll();
/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '520-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '520-589-1970' ] ] ]
*/

//overide example (Phone Number Change)
//
hashT.insert('Rick Mires', '650-589-1970').insert('Tom Bradey', '818-589-1970').insert('Biff Tanin', '987-589-1970');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '818-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '650-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]

*/

hashT.remove('Rick Mires');
hashT.remove('Tom Bradey');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]


*/

hashT.insert('Dick Mires', '650-589-1970').insert('Lam James', '818-589-1970').insert('Ricky Ticky Tavi', '987-589-1970');
hashT.retrieveAll();


/* NOTICE HOW HASH TABLE HAS NOW DOUBLED IN SIZE UPON REACHING 75% CAPACITY ie 6/8. It is now size 16.
 [,
  ,
  [ [ 'Vance Carter', '120-589-1970' ] ],
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Dick Mires', '650-589-1970' ],
    [ 'Lam James', '818-589-1970' ] ],
  ,
  ,
  ,
  ,
  ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Ricky Ticky Tavi', '987-589-1970' ] ],
  ,
  ,
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]




*/
console.log(hashT.retrieve('Lam James'));  //818-589-1970
console.log(hashT.retrieve('Dick Mires')); //650-589-1970
console.log(hashT.retrieve('Ricky Ticky Tavi')); //987-589-1970
console.log(hashT.retrieve('Alex Hawkins')); //510-599-1930
console.log(hashT.retrieve('Lebron James')); //null

3
ভাল দেখাচ্ছে. এখন, দয়া করে এগুলি কেন দরকারী তাও ব্যাখ্যা করুন এবং অন্য সমস্ত উত্তরগুলির চেয়ে এখানে উপযুক্ত।
টমাস টেম্পেলম্যান

1

আপনি নীচের মত ব্যবহার করে একটি তৈরি করতে পারেন:

var dictionary = { Name:"Some Programmer", Age:24, Job:"Writing Programs"  };

//Iterate Over using keys
for (var key in dictionary) {
  console.log("Key: " + key + " , " + "Value: "+ dictionary[key]);
}

//access a key using object notation:
console.log("Her Name is: " + dictionary.Name)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.