একটি জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যগুলি কীভাবে তালিকাভুক্ত করবেন?


841

বলুন আমি এইভাবে একটি বস্তু তৈরি করেছি:

var myObject =
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

সম্পত্তির নামগুলির একটি তালিকা পুনরুদ্ধার করার সর্বোত্তম উপায় কী? অর্থাৎ আমি কিছু পরিবর্তনশীল 'কী' দিয়ে শেষ করতে চাই যেগুলি:

keys == ["ircEvent", "method", "regex"]

3
কিছুটা সামান্য বিষয়, তবে আপনি আন্ডারস্কোর. _.keys(myJSONObject)
js

উত্তর:


1075

আধুনিক ব্রাউজারগুলিতে (আই 9 +, এফএফ 4 +, ক্রোম 5 +, অপেরা 12 +, সাফারি 5 +) আপনি অবজেক্ট.কি পদ্ধতিতে অন্তর্নির্মিত ব্যবহার করতে পারেন :

var keys = Object.keys(myObject);

উপরেরটিতে একটি সম্পূর্ণ পলফিল রয়েছে তবে একটি সরলীকৃত সংস্করণ হ'ল:

var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}

বিকল্প হিসাবে আপনি যে কোনও বস্তুর কল করতে অনুমতি var getKeysদিয়ে প্রতিস্থাপন । প্রোটোটাইপ প্রসারিত করার কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে এবং আমি এটি করার পরামর্শ দেব না।Object.prototype.keys.keys()


17
আমি আবারো এফেক্টে আপডেট করব 'আপনি প্রোটোটাইপ আপত্তি করার জন্য প্রলোভিত হতে পারেন ... তবে করবেন না!'
অ্যান্টনিডব্লোন জোন্স

4
যে কেউ আলোকপাত করতে চান, কেন তাকে অবজেক্টের প্রোটোটাইপে ফাংশন যুক্ত করার পরামর্শ দেওয়া হয় না?
বিশ্বনাথ

2
এটি তার নিজের একটি সম্পূর্ণ ভিন্ন প্রশ্ন, এখানে স্ট্যাকওভারফ্লো বা গুগলে একটি দ্রুত অনুসন্ধান আপনাকে পড়তে প্রচুর পরিমাণে দেবে
এক্সিমি

3
for (var key in myObject) {...}কৌশল ব্রাউজার এবং V8 বাইরে জাভাস্ক্রিপ্ট রানটাইম জন্য দরকারী। উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট ম্যাপ-কমানো কোয়ালিটি রিয়াকের পাস করার সময় Objectঅবজেক্টটির অস্তিত্ব নেই, সুতরাং Object.keysপদ্ধতিটি উপলব্ধ নেই।
একিলবি

19
@ স্ল্যাশনিক আপনার "সরলিকৃত সংস্করণ" অবজেক্টের প্রোটোটাইপ শৃঙ্খলে (যেমন এটি "জন্য ... ইন" ব্যবহার করছে) সমস্ত বৈশিষ্ট্য ফিরিয়ে দেয়, যেখানে (ইসসিএমএসক্রিপ 5.1) Object.keysপদ্ধতি কেবলমাত্র বস্তুর নিজস্ব বৈশিষ্ট্যগুলি প্রদান করে। আমি এটি একটি গুরুত্বপূর্ণ পার্থক্য হিসাবে দেখতে।
মার্টিন ক্যারেল 21

255

হিসাবে slashnick নির্দিষ্ট, আপনি "জন্য" পুনরুক্তি করতে কনস্ট্রাক্ট তার অ্যাট্রিবিউট নামের জন্য একটি বস্তু উপর ব্যবহার করতে পারেন। তবে আপনি অবজেক্টের প্রোটোটাইপ শৃঙ্খলে সমস্ত বৈশিষ্ট্যর নাম দিয়ে পুনরাবৃত্তি করবেন। আপনি যদি কেবলমাত্র অবজেক্টের নিজস্ব বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করতে চান , আপনি অবজেক্ট # hasOwnProperty () পদ্ধতিটি ব্যবহার করতে পারেন । এইভাবে নিম্নলিখিত থাকার।

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        /* useful code here */
    }
}

25
আমি আশা করি উপরের স্ল্যাশনিকের উত্তর আগে এটি পড়েছি। আমাকে escকীটি ধরে রাখতে কেবল 15 মিনিট সময় ব্যয় করতে হয়েছিল কারণ বস্তুর প্রায় এক মিলিয়ন সম্পত্তি ছিল, যার বেশিরভাগ ব্যবহার করা হয়নি, এবং এতে আমার একটি সতর্কতা ছিল।
মার্ক হেন্ডারসন

এখানে জাকাস নিজেই এই বিষয়ে একটি দুর্দান্ত নিবন্ধটি লিখেছেন: এনসিজেওনলাইন.ট.ব্লগ
পাবলো ক্যাবেরা

4
এলএল @ মার্কহেন্ডারসন - তবে পরের বার, ব্রাউজারের প্রক্রিয়াটি মেরে ফেলুন এবং 15 মিনিট নষ্ট করার পরিবর্তে এটি পুনরায় চালু করুন :)
জেডি স্মিথ

সম্পর্কিত ফাংশনটি হ'ল আইজটি.জিটওনপ্রপার্টিনেমস () - বিকাশকারী.মোজিলা.আর.ইন
স্টিভ গুডম্যান

@ মারকহেন্ডারসন কেন আপনি কনসোল.লগ ব্যবহার করবেন না?
লাসাগাআন্ড্রয়েড

102

স্যাম ডটনের উত্তর হিসাবে, ইসমাস্ক্রিপ্টের 5 তম সংস্করণে এই উদ্দেশ্যটির জন্য একটি নতুন পদ্ধতি চালু করা হয়েছে। Object.keys()আপনি যা চান তা করবে এবং ফায়ারফক্স 4 , ক্রোম 6, সাফারি 5 এবং আইই 9 তে সমর্থিত ।

আপনি ব্রাউজারগুলিতে খুব সহজেই পদ্ধতিটি প্রয়োগ করতে পারেন যা এটি সমর্থন করে না। যাইহোক, বাস্তবায়ন করা কিছু বাস্তবায়ন ইন্টারনেট এক্সপ্লোরারের সাথে পুরোপুরি সামঞ্জস্যপূর্ণ নয়। এখানে আরও একটি সুসংগত সমাধান:

Object.keys = Object.keys || (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
        DontEnums = [ 
            'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
            'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
        ],
        DontEnumsLength = DontEnums.length;

    return function (o) {
        if (typeof o != "object" && typeof o != "function" || o === null)
            throw new TypeError("Object.keys called on a non-object");

        var result = [];
        for (var name in o) {
            if (hasOwnProperty.call(o, name))
                result.push(name);
        }

        if (hasDontEnumBug) {
            for (var i = 0; i < DontEnumsLength; i++) {
                if (hasOwnProperty.call(o, DontEnums[i]))
                    result.push(DontEnums[i]);
            }   
        }

        return result;
    };
})();

নোট করুন যে বর্তমানে গৃহীত উত্তরে হ্যাশঅনপ্রপার্টি () এর জন্য একটি চেক অন্তর্ভুক্ত নেই এবং প্রোটোটাইপ চেইনের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি ফিরিয়ে দেবে। এটি ইন্টারনেট এক্সপ্লোরার-এর বিখ্যাত ডন্টইনাম বাগের জন্যও দায়বদ্ধ নয় যেখানে প্রোটোটাইপ চেইনে অগণিত বৈশিষ্ট্যগুলি স্থানীয়ভাবে একই নামযুক্ত সম্পত্তি তাদের ডন্টইনাম বৈশিষ্ট্যের উত্তরাধিকারী হিসাবে ঘোষিত করে।

অবজেক্ট.কিজ () প্রয়োগ করা আপনাকে আরও দৃ solution় সমাধান দেবে।

সম্পাদনা: প্রোটোটাইপের সুপরিচিত অবদানকারী কঙ্গাক্সের সাথে সাম্প্রতিক আলোচনার পরে , আমি এখানে তার Object.forIn()ফাংশনটির কোডের ভিত্তিতে ডন্টইনাম বাগের জন্য কাজটি বাস্তবায়ন করেছি ।


দুর্দান্ত উত্তর, আমি মনে করি গ্রহণযোগ্য উত্তরটি সবচেয়ে কার্যকরী সঠিক সমাধান হিসাবে রয়ে গেছে, ধরে নিই যে এটি সর্বদা জেএসএন ডিক। এটি অবশ্যই অন্য কোথাও ব্যবহার করা উচিত।
ডেভিড স্নাবেল-কাউন্ট

1
@ ডেভিড কাউন্ট: ধন্যবাদ :-) দুর্ভাগ্যক্রমে, স্বীকৃত উত্তরটি ডন্টইনাম বাগের জন্য এখনও খারাপ লাগবে এবং আপনি কখনই জানেন না যে JSON অবজেক্টটির কোনও কী হিসাবে "মান" বা "কনস্ট্রাক্টর" এর মতো স্ট্রিং থাকতে পারে। এটিতে এক্সটেনশানগুলির মাধ্যমে পুনরাবৃত্তি হবে Object.prototype। এটি প্রায়শই ক্ষেত্রে হয়, যদিও এই সংক্ষিপ্ত কোডটি বৃহত্তর, আরও দৃ rob় কোডের চেয়ে উল্লেখযোগ্যভাবে বেশি আবেদনময়ী দেখায়, তবে এই উত্তরের মূল বিষয়টি হ'ল ECMAScript 5 ম ব্যবহার করা হয় Object.keys(), যা ব্রাউজারগুলিতে প্রয়োগ করা যেতে পারে যা এই কোডটি ব্যবহার করে এটি সমর্থন করে না। নেটিভ সংস্করণ এর চেয়ে আরও বেশি পারফরম্যান্ট হবে।
অ্যান্ডি ই

2
অত্যন্ত চমৎকার, অ্যান্ডি :) আমি মনে করিয়ে দিতে মাত্র চাই - কেউ এই থ্রেড উল্লেখ বলে মনে হয় - যে ES5 Object.keysশুধুমাত্র সংশ্লিষ্ট স্ট্রিং একটি অ্যারে ফেরৎ গণনীয় একটি বস্তুর বৈশিষ্ট্য। নেটিভ (ব্যবহারকারী-সংজ্ঞায়িত) অবজেক্টের সাথে কাজ করার সময় এটি গুরুতর হতে পারে না তবে হোস্ট অবজেক্টের সাথে খুব বেশি দৃশ্যমান হওয়া উচিত (যদিও অনির্ধারিত হোস্ট অবজেক্টস আচরণটি আলাদা - বেদনাদায়ক - গল্প)। সমস্ত (অ-গণনাযোগ্য সহ) বৈশিষ্ট্যগুলির উপরে গণনা করার জন্য, ES5 সরবরাহ করে Object.getOwnPropertyNames(আমার তুলনায় এটির সমর্থন দেখুন table টেবিল - kangax.github.com/es5-compat-table )
kangax


2
কেউ ব্যাখ্যা করতে পারেন কেন এটি বাস্তবায়িত হয় Object.keys(stuff)এবং কেন হয় না stuff.keys()?
ব্লেজমোনজার

32

নোট করুন যে অবজেক্ট.কিজ এবং অন্যান্য ইসসিএমএসক্রিপ্ট 5 পদ্ধতি ফায়ারফক্স 4, ক্রোম 6, সাফারি 5, আই 9 এবং তার চেয়ে বেশি দ্বারা সমর্থিত।

উদাহরণ স্বরূপ:

var o = {"foo": 1, "bar": 2}; 
alert(Object.keys(o));

ECMAScript 5 সামঞ্জস্যতা টেবিল: http://kangax.github.com/es5-compat-table/

নতুন পদ্ধতির বিবরণ: http://markcaudill.com/index.php/2009/04/ জাভাস্ক্রিপ্ট- নতুন- বৈশিষ্ট্য- ecma5/


ক্রোম দেব সরঞ্জামগুলি, ফায়ারব্যাগ ইত্যাদির জন্য কনসোলে কীগুলি () পরীক্ষা করে দেখুন
স্যাম ডটন


28

Object.getOwnPropertyNames(obj)

এই ফাংশনটি দেখানো ছাড়াও অগণনীয় বৈশিষ্ট্যগুলি দেখায় Object.keys(obj)

জেএসে, প্রতিটি সম্পত্তিতে বুলিয়ান সহ কয়েকটি সম্পত্তি থাকে enumerable

সাধারণভাবে, অ-গণনাযোগ্য বৈশিষ্ট্যগুলি আরও বেশি "অভ্যন্তরীণ" হয় এবং কম ব্যবহৃত হয়, তবে সত্যিকার অর্থে কী চলছে তা দেখার জন্য মাঝে মাঝে সেগুলি অনুসন্ধান করা অন্তর্দৃষ্টিপূর্ণ।

উদাহরণ:

var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})

console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]

console.log(Object.keys(o))
// [ 'yes' ]

for (var x in o)
    console.log(x)
// yes, base

কীভাবে তা নোট করুন:

  • Object.getOwnPropertyNamesএবং সন্ধানের জন্য প্রোটোটাইপ চেইনে যাবেন Object.keys নাbase
  • for in না

প্রোটোটাইপ চেইন সম্পর্কে আরও এখানে: https://stackoverflow.com/a/23877420/895245


16

আমি ডাম্প ফাংশনটির একটি বিশাল ফ্যান।

http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion বিকল্প পাঠ


1
+1 কারণ আমি এখানে কিছু অনুরূপ নির্মাণের অভিপ্রায় পেয়েছি (তবুও তেমন ভাল নয়)।
ক্যামিলো মার্টিন


@ কুইকিনেট প্রতিবারই এই জাতীয় কিছু তৈরি করতে চাইলে আমি নিয়মিত অবজেক্ট ইন্সপেক্টরকে স্থির করি, আপনি যদি চান যে এইচটিএমএলটিতে রেন্ডার করা হয় তবে এনপিএম মডিউলগুলির মতো জিনিস রয়েছে । সত্যি বলতে কী আমাকে আটকে গেল তা হ'ল আমি সেই চিত্রের চেয়ে আরও ভাল কিছু চাইছিলাম কিন্তু কখনই এটি ধারণায়িত করতে সক্ষম হই নি। পরিদর্শকের মধ্যে অবজেক্টগুলি ব্রাউজ করা বাঞ্ছনীয় তবে স্বেচ্ছাসেবী বিষয়গুলি (যেমন, কলামগুলির সাথে টেবিলগুলিতে অবজেক্টগুলির অ্যারেগুলি সাজিয়ে তোলা) অর্থ ব্যবহার করার চেষ্টা করে না এবং সর্বদা অনুশীলনে কার্যকর হয় না he
ক্যামিলো মার্টিন

সুন্দর মুদ্রণ জাভাস্ক্রিপ্ট সম্পর্কে কি https://j11y.io/demos/prettyprint/?
কিকিনেট

13

নীচে jQuery দিয়ে এটি করতে পারে:

var objectKeys = $.map(object, function(value, key) {
  return key;
});

9

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

this.getKeys = function() {

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

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

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

এটি আমার হাশম্যাপের প্রয়োগের অংশ এবং আমি কেবল কীগুলিই চাই, "এটি" হ্যাশম্যাপ অবজেক্ট যা কীগুলি ধারণ করে


8

এটি বেশিরভাগ ব্রাউজারে, এমনকি আই 8 তেও কাজ করবে এবং কোনও ধরণের লাইব্রেরির প্রয়োজন নেই। ভার আমি আপনার চাবি।

var myJSONObject =  {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; 
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);

2
আপনার উত্তরটি ইতিমধ্যে পোস্ট করা পোস্টগুলির মতো বলে মনে হচ্ছে, যোগ করার মতো আরও কিছু?
ভেকেন


7

মোজিলার যেখানে এটি সমর্থিত নয় এমন ব্রাউজারে এটি কীভাবে করা যায় তার পুরো প্রয়োগের বিশদ রয়েছে :

if (!Object.keys) {
  Object.keys = (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

      var result = [];

      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }

      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    };
  })();
}

আপনি এটি চাইলে এটি অন্তর্ভুক্ত করতে পারেন, তবে সম্ভবত extensions.jsআপনার স্ক্রিপ্ট স্ট্যাকের শীর্ষে কোনও ধরণের ফাইলের মধ্যে।


এমডিএন বাস্তবায়ন অ্যান্ডি ই এর উপর ভিত্তি করে, যা ইতিমধ্যে উত্তর হিসাবে দেওয়া হয়েছিল।
outis

5

ব্যবহার Reflect.ownKeys()

var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]

Object.keys এবং Object.getOwnPropertyNames পেতে পারে না অ গণনীয় বৈশিষ্ট্য। এটি অগণনীয় বৈশিষ্ট্যের জন্য এমনকি কাজ করছে ।

var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]

4

আইই স্থানীয় সম্পত্তির জন্য (আমি আপত্তি করছি) সমর্থন করে না। আমি যে সমস্ত প্রপসগুলি খুঁজে পেতে পারি তার একটি তালিকা এখানে।

মনে হচ্ছে স্ট্যাকওভারফ্লো কিছু বোকা ফিল্টারিং করে।

এই গুগল গ্রুপ পোস্টের নীচে তালিকাটি উপলব্ধ: https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0


4

যেহেতু আমি প্রায় প্রতিটি প্রকল্পে আন্ডারস্কোর.জেএস ব্যবহার করি , তাই আমি এই keysফাংশনটি ব্যবহার করব :

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));

এর আউটপুট হবে:

['name', 'hello']

এটি প্রায়শই ব্যবহৃত জাভাস্ক্রিপ্ট কার্যকারিতার জন্য একটি টুলস লাইব্রেরি রয়েছে: আন্ডারস্কোরস.আর.অর্গ
স্কিমেজস

4

গৃহীত উত্তরের উপর বিল্ডিং।

যদি অবজেক্টটির বৈশিষ্ট্য থাকে তবে আপনি কল করতে চান .properties () চেষ্টা করুন!

var keys = Object.keys(myJSONObject);

for (var j=0; j < keys.length; j++) {
  Object[keys[j]].properties();
}

0

আমার ক্ষেত্রে এবং ক্রস ব্রাউজারে সমাধানের কাজ:

var getKeys = function(obj) {
    var type = typeof  obj;
    var isObjectType = type === 'function' || type === 'object' || !!obj;

    // 1
    if(isObjectType) {
        return Object.keys(obj);
    }

    // 2
    var keys = [];
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            keys.push(i)
        }
    }
    if(keys.length) {
        return keys;
    }

    // 3 - bug for ie9 <
    var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
    if(hasEnumbug) {
        var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
            'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

        var nonEnumIdx = nonEnumerableProps.length;

        while (nonEnumIdx--) {
            var prop = nonEnumerableProps[nonEnumIdx];
            if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                keys.push(prop);
            }
        }

    }

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