পাইথনের মতো জাভাস্ক্রিপ্টে অভিধান রয়েছে?


103

আমার এটির মতো জাভাস্ক্রিপ্টে একটি অভিধান তৈরি করা দরকার

আমি সঠিক চিহ্নটি মনে করি না তবে এটি এমন কিছু ছিল:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }

জাভাস্ক্রিপ্ট এ কি জিনিস আছে?



4
আপনি যে উত্তরটি গ্রহণ করেছেন তা খুব ভুল।
এসবেন স্কোভ পেডারসেন

@ এসবেইনস্কভ পিডারসন আপনি উত্তরে কোন ত্রুটি লক্ষ্য করেছেন?
অ্যান্ডারসন গ্রিন

আমি মন্তব্য করার পরে এটি সম্পাদিত দেখছি। দেখে মনে হচ্ছে: নিখোঁজ ছিল
এসবেন স্কোভ পেডারসেন

4
ES6 মানচিত্রের স্ট্যাকওভারফ্লো.com / a / 32993723 / 1993919 এর জন্য সর্বাধিক সাম্প্রতিক উত্তর পড়ুন (এটি পোস্ট করার জন্য একই কারণে মন্তব্য করা হয়েছে)
ওল্ড ব্যাডম্যান গ্রে

উত্তর:


133

এটি একটি পুরানো পোস্ট, তবে আমি ভেবেছিলাম আমার যাইহোক কোনও সচিত্র উত্তর দেওয়া উচিত।

জাভাস্ক্রিপ্ট এর অবজেক্ট স্বরলিপি ব্যবহার করুন। তাই ভালো:

states_dictionary={ 
     "CT":["alex","harry"], 
     "AK":["liza","alex"], 
     "TX":["fred", "harry"]
};

এবং মানগুলি অ্যাক্সেস করতে:

states_dictionary.AK[0] //which is liza

অথবা আপনি জাভাস্ক্রিপ্ট আক্ষরিক অবজেক্ট স্বরলিপি ব্যবহার করতে পারেন, যার মাধ্যমে কীগুলি উদ্ধৃতিতে থাকা দরকার নেই:

states_dictionary={ 
     CT:["alex","harry"], 
     AK:["liza","alex"], 
     TX:["fred", "harry"]
};

12
এটি লক্ষণীয় যে প্রথম উদাহরণটি উভয় ভাষায় একই শব্দটির সমাপ্তি হওয়া উচিত; সমাপ্তি ';' ব্যতীত একই সিনট্যাক্স ব্যবহার করে। রাজ্য_ অভিধান = C "সিটি": ["অ্যালেক্স", "হ্যারি"], "একে": ["লিজা", "অ্যালেক্স"], "টিএক্স": ["ফ্রেড", "হ্যারি"]}
ডেনিস সি

আপনি আক্ষরিক অবজেক্টের স্বরলিপি ব্যবহারে বেশি অভ্যস্ত, যেহেতু আপনি তাদের একইভাবে অ্যাক্সেস করেন তবে উভয়ের মধ্যে পার্থক্য কী?
জন দেমেট্রিও

4
@ জনডেমিটরিউ মূল পার্থক্যটি হচ্ছে জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন কীগুলি অবশ্যই স্ট্রিং থাকতে হবে (ডাবল উদ্ধৃতিতে আবদ্ধ "") তথ্য আন্তঃব্যবহারের জন্য জেএসএন-তে বস্তুর স্বরলিপিটি দেখা গেছে এবং আক্ষরিক বস্তু স্বরলিপি দ্বারা অনুপ্রাণিত হয়েছিল; এটি লক্ষণীয় যে JSON সাধারণত স্ট্রিং প্রসঙ্গে ব্যবহৃত হয়
চিফ

4
আসলে, পাইথন বিবৃতি-সমাপ্তি সেমিকোলনগুলিকে মঞ্জুরি দেয়, সুতরাং প্রথম উদাহরণটি পাইথন এবং জাভাস্ক্রিপ্ট উভয় ক্ষেত্রেই সম্পূর্ণ বৈধ
সেলটিকমিনিস্ট্রেল

মান ব্যবহারকারীর কাছ থেকে আসে, তাহলে পরোয়া চাহিদা ব্যবহারের গ্রহণ করা Object.hasOwnProperty.call(dictionary, key)(অন্যথায় ব্যবহারকারীর একটি মান লিখতে পারেন valueOf এবং dictionary['valueOf']ফেরৎ Object.valueOf()ফাংশন বস্তু প্রোটোটাইপ সম্ভবত নয় কি আপনার কোড আশা একাত্মতার - সম্ভাব্য বাগ অথবা সুরক্ষা সমস্যা )। যদি কীটি কোনও স্ট্রিং ধরণের না হয়, তবে যত্ন নেওয়া দরকার, অন্যথায় অন্তর্নিহিত সংখ্যা এবং টোস্ট্রিং রূপান্তরগুলি আপনাকে সমস্যার কারণ হতে পারে। ES6 Mapপ্রকারটি অভিধানের জন্য বর্ধিত কার্যকারিতা সরবরাহ করার জন্য ডিজাইন করা হয়েছে।
রোবোক্যাট

54

২০১৫ সাল পর্যন্ত জাভাস্ক্রিপ্টে কোনও আসল সহযোগী অ্যারে নেই (ইসকামাস্ক্রিপ্ট of এর প্রকাশ)। তার পর থেকে আপনি মানচিত্র অবজেক্টটি রোবোক্যাটের রাজ্য হিসাবে ব্যবহার করতে পারবেন। এমডিএন-এ বিশদটি দেখুন । উদাহরণ:

let map = new Map();
map.set('key', {'value1', 'value2'});
let values = map.get('key');

ES6 এর সমর্থন ছাড়াই আপনি অবজেক্টগুলি ব্যবহার করে দেখতে পারেন:

var x = new Object();
x["Key"] = "Value";

তবে বস্তুগুলির সাহায্যে সাধারণত অ্যারে বৈশিষ্ট্য বা অ্যারে.লাইথের মতো পদ্ধতি ব্যবহার করা সম্ভব নয়। অন্তত ইন-লুপটিতে "অবজেক্ট-অ্যারে" অ্যাক্সেস করা সম্ভব।


4
পারফরম্যান্সের কী হবে? ধ্রুবক সময় একটি অবজেক্টে একটি চাবি খুঁজছেন?
সাহের আহওয়াল

4
যেহেতু ও ["কী"] জাভাস্ক্রিপ্টে o.key এর সমতুল্য পারফরম্যান্স প্রায় একই রকম। তবে পারফরম্যান্স জাভাস্ক্রিপ্ট ইঞ্জিন / ওয়েব ব্রাউজারের উপর নির্ভর করে। এগুলির মধ্যে বিশেষত পুরানো সংস্করণগুলিতে অনেকগুলি পার্থক্য রয়েছে।
অ্যালেক্স

ইসমাস্ক্রিপ্ট একটি অফিশিয়াল মানচিত্র অবজেক্টকে সংজ্ঞায়িত করেছে (অর্থাত "জাভাস্ক্রিপ্টে কোনও আসল সহযোগী অ্যারে নেই" এখন ভুল)।
রোবোক্যাট

18

আমি বুঝতে পেরেছি এটি একটি পুরানো প্রশ্ন, তবে আপনি যখন গুপ্তচর জাভাস্ক্রিপ্ট অভিধানগুলি অনুসন্ধান করবেন তখন গুগলে এটি আপ হয়, সুতরাং আমি উপরের উত্তরগুলিতে যুক্ত করতে চাই যে ECMAScript 6 এ অফিসিয়াল Mapঅবজেক্টটি চালু করা হয়েছে, যা একটি অভিধান বাস্তবায়ন:

var dict = new Map();
dict.set("foo", "bar");

//returns "bar"
dict.get("foo");

জাভাস্ক্রিপ্টের সাধারণ বিষয়গুলির থেকে পৃথক, এটি কোনও বস্তুকে কী হিসাবে মঞ্জুরি দেয়:

var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");

//returns "Bar"
dict.get(bar);

//returns "Foo"
dict.get(foo);

//returns undefined, as {} !== foo and {} !== bar
dict.get({});

আমার জন্য কাজ করে, একটি ক্লিনার ES6 পদ্ধতি ব্যবহার করে ভাল। ধন্যবাদ! অনুসরণ করুন, "পাইথনের মতো" বাল্ক সেট () "র কোনও উপায় আমরা জানি dict = { key: value)?
জো সাদোস্কি

10

এখানে জেএসে একটি সাধারণ অভিধান তৈরি করেছেন:

function JSdict() {
    this.Keys = [];
    this.Values = [];
}

// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
    JSdict.prototype.getVal = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        for (var i = 0; i < this.Keys.length; i++) {
            if (this.Keys[i] == key) {
                return this.Values[i];
            }
        }
        return "Key not found!";
    }
}


// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
    JSdict.prototype.update = function (key, val) {
        if (key == null || val == null) {
            return "Key or Value cannot be null";
        }
        // Verify dict integrity before each operation
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Values[i] = val;
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}



// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
    JSdict.prototype.add = function (key, val) {
        // Allow only strings or numbers as keys
        if (typeof (key) == "number" || typeof (key) == "string") {
            if (key == null || val == null) {
                return "Key or Value cannot be null";
            }
            if (keysLength != valsLength) {
                return "Dictionary inconsistent. Keys length don't match values!";
            }
            var keysLength = this.Keys.length;
            var valsLength = this.Values.length;
            for (var i = 0; i < keysLength; i++) {
                if (this.Keys[i] == key) {
                    return "Duplicate keys not allowed!";
                }
            }
            this.Keys.push(key);
            this.Values.push(val);
        }
        else {
            return "Only number or string can be key!";
        }
    }
}

// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
    JSdict.prototype.remove = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Keys.shift(key);
                this.Values.shift(this.Values[i]);
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}

উপরোক্ত প্রয়োগটি এখন একটি অভিধান অনুকরণ করতে ব্যবহার করা যেতে পারে:

var dict = new JSdict();

dict.add(1, "one")

dict.add(1, "one more")
"Duplicate keys not allowed!"

dict.getVal(1)
"one"

dict.update(1, "onne")

dict.getVal(1)
"onne"

dict.remove(1)

dict.getVal(1)
"Key not found!"

এটি কেবল একটি প্রাথমিক সিমুলেশন। এটি কমপক্ষে O (nlogn) সময় জটিলতা বা তার চেয়েও কম সময়ে কাজ করার জন্য আরও ভাল চলমান সময়ের অ্যালগরিদম প্রয়োগ করে আরও অনুকূলিত করা যেতে পারে। অ্যারেগুলিতে মার্জ / দ্রুত সাজানোর মতো এবং তারপরে লুকআপের জন্য কিছু বি-অনুসন্ধান। আমি জেএস-তে কোনও হ্যাশ ফাংশন ম্যাপিংয়ের চেষ্টা করেছিলাম বা অনুসন্ধান করি নি।

এছাড়াও, জেএসডিক্ট আপজের জন্য কী এবং মানটি গোপনীয় হওয়ার জন্য ব্যক্তিগত ভেরিয়েবলগুলিতে রূপান্তর করা যেতে পারে।

আশাকরি এটা সাহায্য করবে!

সম্পাদনা করুন >> উপরের প্রয়োগের পরে, আমি ব্যক্তিগতভাবে জেএস অবজেক্টগুলিকে বাক্সের বাইরে পাওয়া যায় এমন সহযোগী অ্যারে হিসাবে ব্যবহার করি।

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

যেমন: ডিক.হসনপ্রপার্টি (কী) এবং ডিক মুছুন [কী]

এই প্রয়োগ / ব্যবহারের একটি ভাল উত্স হিসাবে এই পোস্টটি পড়ুন। সচলভাবে জাভাস্ক্রিপ্ট সহযোগী অ্যারেতে কীগুলি তৈরি করা হচ্ছে

ধন্যবাদ!


5

জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করুন। আপনি অভিধানে কীগুলির মতো তাদের বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন। এটি জেএসএনের ভিত্তি। বাক্য গঠনটি পাইথন অভিধানের মতো to দেখুন: জেএসওএন.অর্গ


4

একটি পুরানো প্রশ্ন তবে আমার সম্প্রতি একটি এএস 3> জেএস বন্দরটি করা দরকার ছিল এবং গতির স্বার্থে আমি জেএসের জন্য একটি সাধারণ এএস 3-শৈলীর অভিধান অবজেক্টটি লিখেছি:

http://jsfiddle.net/MickMalone1983/VEpFf/2/

যদি আপনি না জানতেন তবে এএস 3 অভিধান আপনাকে কোনও স্ট্রিংয়ের বিপরীতে কোনও অবজেক্টটিকে কী হিসাবে ব্যবহার করতে দেয়। আপনি যখন তাদের জন্য কোনও ব্যবহার খুঁজে পেয়েছেন তখন এগুলি খুব কাজে আসে।

এটি কোনও নেটিভ অবজেক্ট হিসাবে তত দ্রুত নয়, তবে আমি সে সম্পর্কে কোনও উল্লেখযোগ্য সমস্যা পাইনি।

এপিআই:

//Constructor
var dict = new Dict(overwrite:Boolean);

//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.

dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
    console.log(key+' is key for '+value);
});


dict.get(key);//Get value from key

4
চমৎকার এবং দরকারী গ্রন্থাগার! আমি একটি গেট ফাংশন যুক্ত করেছি, যা আমি ভেবেছিলাম যে এটি অনুপস্থিত ছিল এবং কিছু ছোটখাটো সিনট্যাক্স সমস্যা সমাধান করা হয়েছে (সেমিকোলন অনুপস্থিত)। এখানে পরিবর্তিত ফিডলটি রয়েছে
ম্যাট

ভালো কাজের সাথী, দুন্নো কেন সেখানে ছিল না!
মিকম্যালোন 1983

2

ফায়ারফক্স 13+ পাইথনের mapবস্তুর অনুরূপ অবজেক্টের একটি পরীক্ষামূলক বাস্তবায়ন সরবরাহ করে dictবিশেষ উল্লেখ এখানে

এটি কেবল ফায়ারফক্সে উপলভ্য, তবে এটির বৈশিষ্ট্যগুলি ব্যবহার করার চেয়ে এটি আরও ভাল দেখাচ্ছে new Object()। ডকুমেন্টেশন থেকে উদ্ধৃতি:

  • একটি অবজেক্টের একটি প্রোটোটাইপ রয়েছে, তাই মানচিত্রে ডিফল্ট কী রয়েছে। তবে এটি ব্যবহার করে বাইপাস করা যায় map = Object.create(null)
  • একটি কি Objectহয় Strings, যেখানে তারা একটি জন্য কোনো মূল্য হতে পারে Map
  • আপনি Mapম্যানুয়ালি একটি এর জন্য আকারের ট্র্যাক রাখতে হবে যখন আপনি সহজেই আকারটি পেতে পারেন Object
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.