একটি হ্যাশ কী কীভাবে সন্ধান করবেন?


192

আমি জাভাস্ক্রিপ্ট অবজেক্টে হ্যাশ হিসাবে দ্বিগুণ জানি কিন্তু আমি কীগুলি পেতে কোনও বিল্ট ইন ফাংশনটি খুঁজে পেতে অক্ষম

var h = {a:'b',c:'d'};

আমি কিছু চাই

var k = h.keys() ; // k = ['a','c'];

আইটেমগুলির পুনরাবৃত্তি করতে এবং আমি ফিরে আসা একটি অ্যারেতে কীগুলি যুক্ত করার জন্য নিজেই একটি ফাংশন লিখতে সহজ, তবে এটি করার কোনও মানক পরিষ্কার উপায় আছে কি?

আমি অনুভব করি যে এটি অবশ্যই একটি সাধারণ বিল্ট ফাংশন যা আমি মিস করেছি তবে এটি খুঁজে পাচ্ছি না!


আমি কেবল জাভাস্ক্রিপ্টে ঝাঁপ দিচ্ছি তবে এই পোস্টটি আপনাকে সাহায্য করতে পারে। dean.edwards.name/weblog/2006/07/enum
জেসন সালডো


1
কীগুলি থেকে মানগুলি সম্পর্কে কী বলা যায়? এছাড়াও, একটি হ্যাশে কীগুলির সংখ্যা পাওয়া।
শূন্য_কুল

2017 এর উত্তর: অবজেক্ট.কিজ (এইচ) অবজেক্ট.ভেলিউস (জ)
হারানো

উত্তর:


274

Object.keysএই অপারেশনটি সম্পাদন করার জন্য আধুনিক জাভাস্ক্রিপ্টে (ECMAScript 5) ফাংশন রয়েছে :

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

সামঞ্জস্যতার বিশদ এখানে পাওয়া যাবে

উপর মোজিলা সাইটে সেখানে অনুন্নত সামঞ্জস্যের জন্য একটি স্নিপেট হল:

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

এটা কি আরও প্রাকৃতিক হত না? if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
এক্কিস

2
যেহেতু আমি বুঝতে পারি এটি অবজেক্টের সমস্ত উপ-শ্রেণীর Object.prototype.keysজন্য keysউপলব্ধ করা হবে, সুতরাং সমস্ত বস্তুর জন্য। আপনি যদি ওওপি ব্যবহার করার চেষ্টা করছেন তবে সম্ভবত যা আপনি চান। যাইহোক এটি সত্যিই আপনার প্রয়োজনীয়তার উপর নির্ভর করে।
ইভান নেভোস্ট্রুভ

1
আপনি যদি মটুলগুলি ব্যবহার করেন তবে অবজেক্ট.কিজ () সমস্ত ব্রাউজারে পাওয়া উচিত।
টিপিয়র

কৌনিক টেম্পলেটগুলিতে এটি ব্যবহার করার মতো কিছু আছে কি? পার্টির ভিতরে এটি কাজ করছে না।
জে শুক্ল

আমি মনে করি আপনার কোড নমুনা সহ পৃথক প্রশ্ন হিসাবে এটি জিজ্ঞাসা করা উচিত।
ইভান নেভোস্ট্র্রুভ

80

ক্লায়েন্ট ব্রাউজারগুলির সাথে একটি বৃহত সামঞ্জস্যের প্রয়োজনে উত্পাদন কোডের জন্য আমি Object.keysপুরানো ব্রাউজারগুলিতে নিশ্চিত করার জন্য উপরে ইভান নেভোস্ট্র্রুভের উত্তরটি শিমের সাথে প্রস্তাব করি । তবে ইসিএমএর নতুন definePropertyবৈশিষ্ট্যটি ব্যবহার করে অনুরোধ করা সঠিক কার্যকারিতা পাওয়া সম্ভব ।

ECMAScript 5 হিসাবে - অবজেক্ট.ডাইফাইনপ্রোপার্টি

ইসিএমএ 5 হিসাবে আপনি অগণনীয় Object.defineProperty()বৈশিষ্ট্য সংজ্ঞায়িত করতে ব্যবহার করতে পারেন । বর্তমান সামঞ্জস্য এখনও অনেক আকাঙ্ক্ষিত করা হয়েছে, কিন্তু এই শেষ পর্যন্ত সব ব্রাউজারে ব্যবহারযোগ্য হওয়া উচিত। (আইই 8 এর সাথে বিশেষত বর্তমানের অসঙ্গতি নোট করুন!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

তবে, যেহেতু ইসিএমএ 5 ইতিমধ্যে যুক্ত করেছে Object.keysআপনি পাশাপাশি ব্যবহার করতে পারেন:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

আসল উত্তর

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

সম্পাদনা: যেহেতু এই উত্তরটি কিছুক্ষণের জন্য হয়ে গেছে আমি উপরেরটি অচ্ছুত রেখে দেব। যে কেউ এটি পড়ছেন তার নীচের নীচে ইভান নেভোস্ট্র্রুভের উত্তরটিও পড়তে হবে।

প্রোটোটাইপ ফাংশনগুলিকে অগণনীয় করে তোলার কোনও উপায় নেই যা তাদের সর্বদা ব্যবহার না করে এমন ইন-লুপগুলিতে সরিয়ে নিয়ে যায় hasOwnProperty। আমি এখনও মনে করি যদি অবজেক্টের প্রোটোটাইপটি প্রসারিত করা এত অগোছালো না হত তবে এই উত্তরটি আদর্শ হবে।


9
'hasOwnProperty' এই অবজেক্টের প্রোটোটাইপগুলির বৈশিষ্ট্যগুলি বাদ দেয় যা জানার জন্য দরকারী।
ijw

2
উত্তর গৃহীত হয়েছে কারণ এটিকে আমি কার্যকরভাবে শেষ করেছি তবে আমার মনে হয় এটি ভাষার কোনও অন্তর্নির্মিত কাজ হওয়া উচিত ছিল।
প্যাট

5
নোট করুন যে বৈশ্বিক ভেরিয়েবল তৈরি করা এড়াতে আপনার "এর জন্য (এর মধ্যে আমি ...)" ব্যবহার করা উচিত।
ব্র্যাড জি।

5
আমি অবজেক্ট.প্রোটোটাইপটি পরিবর্তন এড়াতে চাই - নীচে উল্লিখিত অন্য একজন মন্তব্যকারী হিসাবে, এটি সহজেই স্ক্রিপ্টগুলি ভেঙে ফেলতে পারে যা হ'লঅনপ্রোপার্টি () যাচাইয়ের বিষয়ে সতর্ক নয়। পরিবর্তে, কম ও-বান্ধব উপায়টি ব্যবহার করুন: একটি 'কী' ফাংশনটি ইতিমধ্যে উপস্থিত না থাকলে সংজ্ঞা দিন। (ফায়ারফক্স এবং ক্রোম উভয়ই একটি নেটিভ কী () ফাংশন বাস্তবায়ন করে যা ওপি যা চায় ঠিক তা করে - আইই চায় না)
ডিজিটালথ

1
অবজেক্ট.প্রোটোটাইপে কোনও কিছু যুক্ত করা একটি খারাপ ধারণা বলে মনে হচ্ছে, কারণ এটি প্রতিটি সাধারণ লুপ যেমন: ব্রেক (অ্যারেতে var k) {} বা (বস্তুর মধ্যে var কে) এবং সেই আইডিয়ম - যদিও এটি ত্রুটিযুক্ত হতে পারে - অত্যন্ত সাধারণ। উদাহরণস্বরূপ নীচে ম্যাথু ডারউইনের উত্তর অনুসারে এটি গুগল ম্যাপসকে ভেঙে দেয়।
স্যাম ওয়াটকিন্স


33

আপনি অ্যান্ডস্কোর.জেএস ব্যবহার করতে পারেন যা জাভাস্ক্রিপ্ট ইউটিলিটি লাইব্রেরি।

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

ঠিক আছে, এটি আসলে যা বলা হয়েছিল তা নয়, কারণ @ প্যাট একটি অন্তর্নির্মিত ফাংশন খুঁজছেন, তবে এটি একটি আকর্ষণীয় গ্রন্থাগার, এবং এটি কোনও পরিবর্তন করে নাObject.prototype
freskoma

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

_.keys(obj).lengthকোনও কী আছে কিনা তা দেখতে।
chovy

13

আমি যতদূর জানি এটি আপনি সবচেয়ে ভাল করতে পারেন ...

var keys = [];
for (var k in h)keys.push(k);

2
যখন অবজেক্ট.প্রোটোটাইপটি মেসে গেছে তখন এটিও কাজ করে না।
ফিল

4
এটি ব্যবহার করা ভাল, এবং অবজেক্ট.প্রোটোটাইপটির সাথে "গণ্ডগোল" না করা ভাল। দেখে মনে হচ্ছে যে আমরা অবজেক্ট.প্রোটোটাইপগুলিতে জিনিসগুলি যুক্ত করলে সবকিছু ভেঙে যায়: অ্যারে / অবজেক্টের কীগুলি লুপ করা এটি একটি অত্যন্ত সাধারণ প্রতিমা।
স্যাম ওয়াটকিন্স

8

jQuery ব্যবহার করে আপনি কীগুলি এই জাতীয়ভাবে পেতে পারেন:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

বা:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

@ পিমলোটককে ধন্যবাদ


3
আপনি যদি এই রুটে যেতে চান, আপনি পাশাপাশি ব্যবহার করতে পারেন JQuery.map: $.map(h, function(v,k) { return k; });
পিমলটক

6

আমি বিশ্বাস করি আপনি / ইন ব্যবহার করে অবজেক্টের বৈশিষ্ট্যগুলি লুপ করতে পারেন, যাতে আপনি এরকম কিছু করতে পারেন:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

4

আমি উপরের রেট দেওয়া উত্তরটি ব্যবহার করতে চেয়েছিলাম

Object.prototype.keys = function () ...

তবে গুগল ম্যাপস এপিআই ভি 3 এর সাথে মিলে ব্যবহার করার সময়, গুগল ম্যাপগুলি অ-কার্যকরী হয়।

for (var key in h) ...

ভাল কাজ করে.


1

আপনি যদি কেবলমাত্র উপাদানগুলি না হয়ে কেবল ফাংশনগুলি পেতে চেষ্টা করছেন তবে এই কোডটি আপনাকে সহায়তা করতে পারে

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

এটি আমার হাশম্যাপ বাস্তবায়নের অংশ এবং আমি কেবল কীগুলিই চাই, হ্যাশম্যাপ thisঅবজেক্টে কীগুলি রয়েছে

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