জাভাস্ক্রিপ্টে কোনও বস্তুর নির্দিষ্ট সম্পত্তি রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?


1486

জাভাস্ক্রিপ্টে কোনও বস্তুর নির্দিষ্ট সম্পত্তি রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?

বিবেচনা:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

এটি কি এটি সেরা উপায়?


21
প্রত্যেকের উত্তর সহ আমি একটি জেএসপিফার পরীক্ষা লিখেছিলাম যা দেখতে সবচেয়ে দ্রুত: jsperf.com/d
অভিধান-

(অবজেক্টে 'সম্পত্তি নাম')? 'সম্পত্তি আছে': 'সম্পত্তি নেই'
মোহন রাম

1
@ স্টাইফ্লে জেএসপিআফ পরীক্ষার জন্য ধন্যবাদ thanks inএবং hasOwnPropertyবেরিয়ে আসেন উপায় অন্যদের তুলনায় ধীর আমার জন্য (98% ধীর)। আমি hasOwnPropertyধীর হয়ে যাওয়ার বিষয়ে অবাক নই তবে আমি অবাক হয়েছি in
ইভানর্ম্মফি

উত্তর:


1423

আমি যে উত্তরগুলি দিয়েছি তা শুনে আমি সত্যিই বিভ্রান্ত হয়ে পড়েছি - তাদের বেশিরভাগই কেবল সম্পূর্ণ ভুল। অবশ্যই আপনার অবজেক্টের বৈশিষ্ট্য থাকতে পারে যা অপরিজ্ঞাত, নাল, বা মিথ্যা মান রয়েছে। সুতরাং কেবল সম্পত্তি তদন্তকে কমিয়ে দেওয়া typeof this[property]বা আরও খারাপ এটি x.keyআপনাকে সম্পূর্ণ বিভ্রান্তিকর ফলাফল দেবে।

এটি আপনি যা খুঁজছেন তার উপর নির্ভর করে। যদি আপনি জানতে চান যে কোনও বস্তুর শারীরিকভাবে কোনও সম্পত্তি রয়েছে কিনা (এবং এটি কোথাও কোথাও থেকে প্রোটোটাইপ চেইনে আসছে না) তবে object.hasOwnPropertyযাওয়ার উপায়। সমস্ত আধুনিক ব্রাউজার এটি সমর্থন করে। (এটি সাফারির পুরানো সংস্করণগুলি - ২.০.১ এবং তার চেয়েও পুরনো ছিল - তবে ব্রাউজারের সেই সংস্করণগুলি খুব কমই ব্যবহৃত হয় rarely)

যদি আপনি যা সন্ধান করছেন তা যদি কোনও বস্তুর এমন কোনও সম্পত্তি থাকে যা পুনরাবৃত্তিযোগ্য হয় (আপনি যখন বস্তুর বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করেন, এটি প্রদর্শিত হবে) তখন করছেন: prop in objectআপনাকে আপনার পছন্দসই প্রভাব দেবে।

যেহেতু hasOwnPropertyসম্ভবত ব্যবহার করা আপনি যা চান তা সম্ভবত এবং আপনি একটি ফ্যালব্যাক পদ্ধতি চান তা বিবেচনা করে আমি নিম্নলিখিত সমাধানটি আপনার কাছে উপস্থাপন করছি:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

উপরেরটি হ'ল একটি কার্যকারী, ক্রস ব্রাউজার, এর সমাধান hasOwnPropertyযার সাথে একটি সতর্কতা রয়েছে: এটি অভিন্ন সম্পত্তি প্রোটোটাইপ এবং উদাহরণ হিসাবে যে ক্ষেত্রে পার্থক্য করতে অক্ষম - এটি কেবল ধরে নেয় যে এটি প্রোটোটাইপ থেকে আসছে। আপনি আপনার অবস্থার উপর ভিত্তি করে এটিকে আরও হালকা বা কঠোর হতে শিফট করতে পারেন, তবে খুব কমপক্ষে এটি আরও সহায়ক হওয়া উচিত।


5
@grantwparks আপনি যদি একটি সাধারণ স্লাইডার প্লাগইন তৈরি করে থাকেন এবং কোনও বিকল্প আইটেমের অস্তিত্ব পরীক্ষা করতে চান তবে এটি সম্ভবত প্রয়োজনের চেয়ে বেশি হতে পারে। আপনি যেমন কিছু করতে পারেন var w = opts.w || 100;। তবে আপনি যদি কোনও লাইব্রেরির ধরণের কিছুতে চলে যান তবে কিছু অংশে আপনাকে কিছুটা দূরে যেতে হবে।
হালিল Özgür

@ ক্রালকো 626: হ্যাঁ, আজকাল আমি অনুমান করি যে এটি হ'ল ওপনপ্রটি () -র সাথে যাওয়া বেশ নিরাপদ but তবে সত্যিকারের সুরক্ষিত ক্রস-ব্রাউজার সমাধানের জন্য, জনের সাথে যেতে হবে।
জ্যাকব

অস্থায়ী পরিবর্তন __proto__বাতিল সম্পর্কে কি ? সরল প্ররোচনা: function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }(সাথে কেস যুক্ত করা obj.constructor.prototypeউচিত)।
জো জো

2
@ কাস্তটান মানহীন __proto__এবং কিছু পুরানো ব্রাউজারে এটি কাজ করে না। এমনকি Object.getPrototypeOfস্ট্যান্ডার্ডের সাম্প্রতিক সংযোজনের সাথে আপনি এখনও কোনও বিদ্যমান অবজেক্টের প্রোটোটাইপ পরিবর্তন করতে পারবেন না।
ম্যাট ব্রাউন

13
একটি for(prop in object)লুপ কেবল অসংখ্য গুণাবলী পুনরুক্ত করে। যাইহোক, সম্পত্তিটি প্রোটোটাইপিকাল চেইনে কোথাও সম্পত্তি রয়েছে prop in objectকিনা তা পরীক্ষা করে দেখুন , এটি গণনাযোগ্য কি না। objectprop
ওরিওল

283

সহ Underscore.jsবা ( আরও ভাল ) lodash:

_.has(x, 'key');

যা কল করে Object.prototype.hasOwnProperty, কিন্তু (ক) টাইপ করা সংক্ষিপ্ত এবং (খ) "একটি নিরাপদ রেফারেন্স hasOwnProperty" ব্যবহার করে (যেমন এটি hasOwnPropertyওভাররাইট করা হলেও এটি কাজ করে )।

বিশেষত, লোডাশ সংজ্ঞা দেয় _.has:

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty

52
আমি অনুমান করব এটি কারণ কারণ জটিল ডিওএম ম্যানিপুলেশন সম্পর্কে প্রশ্ন থাকা সত্ত্বেও "এই লাইব্রেরিটি যুক্ত করুন" খুব কমই একটি জনপ্রিয় সমাধান এবং উত্তরটি "যান জিকুয়ারি ব্যবহার করুন"।
উইনফিল্ড ট্রেল

11
আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, @ ডাউনডাউনড, ধন্যবাদ ঘটনাক্রমে, যদি কেউ পুরো লোড্যাশ লাইব্রেরিটি অন্তর্ভুক্ত করতে বিরত থাকে তবে একজন উপ-উপাদানগুলি সংকলন করতে পারে বা npm install lodash.hasযা এনপিএম মডিউলটি কেবলমাত্র একটি hasফাংশন সহ প্রকাশ করে যা সংক্ষিপ্তকরণের পরে 175 বাইটে সংকলিত হয়। lodash.has/index.jsখুব জনপ্রিয় এবং বিশ্বস্ত লাইব্রেরি কীভাবে কাজ করে তা দেখার জন্য এটি অন্তর্দৃষ্টিপূর্ণ ।
ব্রায়ান এম হান্ট

9
এবং lodashএর সংস্করণগুলি এর সাথে কাজ করে: ফেরত দেওয়ার .has(undefined, 'someKey') => falseসময়underscoreundefined
ব্র্যাড পার্কগুলি

13
lodash"এখনও অন্য" নির্ভরতা হিসাবে যোগ করার বিষয়ে ঝকঝকে প্রত্যেকের জন্য : এটি এই ধরণের জিনিসগুলির জন্য মোটামুটি সাধারণ (যদি সবচেয়ে সাধারণ না হয়) লাইব্রেরি। চাকা পুনরুদ্ধার করতে মজা করুন।
প্রিয়দু নিমরে

11
এমনকি আপনি যদি চাকাটি পুনর্বিবেচনা করতে চান তবে বিদ্যমান চাকাগুলি পরীক্ষা করা কোনও খারাপ ধারণা নয়।
আতুরস্যামস

146

কি সম্পর্কে?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}

13
কেবল লক্ষণীয়, এটি সংকীর্ণ অর্থে 'অবজেক্টস' নিয়ে কাজ করে, তাই এটি {as হিসাবে ঘোষিত বা কনস্ট্রাক্টর ব্যবহার করে তৈরি করা হয়েছে, এটি অ্যারে বা আদিমিকে গ্রহণ করে না। ওপি এটির প্রয়োজনীয়তা রাখে না, তবে আরও কিছু উত্তরগুলি আরও বিস্তৃত কৌশলগুলি সরবরাহ করে (অ্যারে, স্ট্রিং ইত্যাদির সাথে কাজ করে)
ডানুবিয়ান নাবিক

@ Poin এটি নির্দেশ করার জন্য ধন্যবাদ (একজনের কেন inঅপারেটর ব্যবহার করা উচিত এবং কী করা উচিত সে সম্পর্কে স্বীকৃত উত্তরটি বিশদে যায় না Also এছাড়াও নোট করুন যে inঅপারেটরের রয়েছে দুর্দান্ত ব্রাউজার সমর্থন IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ স্ট্যাকওভারফ্লো
অ্যাড্রিয়েন

2
অপারেটর inপ্রোটোটাইপ বৈশিষ্ট্যগুলির বিরুদ্ধেও পরীক্ষা করে, যখন hasOwnPropertyকেবল ব্যবহারকারী-সংজ্ঞায়িত বৈশিষ্ট্যগুলিকে পুনরায় করে। তথ্যসূত্র: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

2
'key' in x কি অ্যারে সঙ্গে কাজ করে। প্রমাণ: stackoverflow.com/questions/33592385/...
CosmoMyzrailGorynych

সেরা এবং সংক্ষিপ্ত বিকল্পটির মতো মনে হচ্ছে
user365314

132

উল্লেখ্য : নিম্নোক্ত আজকাল কঠোর মোডে মূলত অপ্রচলিত ধন্যবাদ, এবং hasOwnProperty। সঠিক সমাধানটি হ'ল কঠোর মোড ব্যবহার করা এবং এটি ব্যবহার করে কোনও সম্পত্তির উপস্থিতি যাচাই করা obj.hasOwnProperty। এই উত্তরটি এই দুটি বিষয়কেই পূর্বাভাস দেয় , কমপক্ষে ব্যাপকভাবে প্রয়োগ করা হয়েছে (হ্যাঁ, এটি সেই পুরানো)। নিম্নলিখিতটি একটি historicalতিহাসিক নোট হিসাবে গ্রহণ করুন।


মনে রাখবেন যে undefinedআছে (দুর্ভাগ্যবশত) না জাভাস্ক্রিপ্ট মধ্যে একটি সংরক্ষিত শব্দ কঠোর মোডে ব্যবহার করছেন না পারেন। অতএব, আপনার কোডটি ভেঙে অন্য কাউকে (স্পষ্টতই অন্য কেউ) এটিকে নতুন করে সংজ্ঞায়িত করার দুর্দান্ত ধারণা পেতে পারে।

আরও শক্তিশালী পদ্ধতিটি নিম্নলিখিত:

if (typeof(x.attribute) !== 'undefined')

ফ্লিপ দিকে, এই পদ্ধতিটি আরও বেশি ভার্বোজ এবং ধীরে ধীরে। : - /

একটি সাধারণ বিকল্প তা নিশ্চিত করার জন্য হয় undefinedহয় আসলে অনির্ধারিত, একটি ফাংশন যা একটি অতিরিক্ত প্যারামিটার গ্রহণ, বলা কোডটি বসিয়ে যেমন undefined, যে একটি মান পাস করা হয় না। এটির কোনও মান পাস করা হয়নি তা নিশ্চিত করার জন্য, আপনি কেবল এটি তাত্ক্ষণিক নিজেকে কল করতে পারেন, যেমন:

(function (undefined) {
     your code 
    if (x.attribute !== undefined)
         mode code 
})();

6
কেবল কৌতূহলীয়, যেহেতু void 0আধ্যাত্মিক ফিরিয়ে দিতে সংজ্ঞায়িত করা হয়েছে undefined, কেউ কি করতে পারে x.attribute !== void 0?
ব্রায়ান এম হান্ট

1
ব্রায়ান: আমি কোনও বিশেষজ্ঞ নই, তবে নিশ্চিত যে এটি সঠিক করার জন্য একটি চতুর উপায় বলে মনে হচ্ছে।
ক্রিস্টোফার স্মিথ

37
বিখ্যাত 'অন্য কেউ' যদি অপরিবর্তিতাকে কী সংজ্ঞা দিয়ে থাকে তবে আমি মনে করি যে কোডটির পুনরায় লেখাই হবে কর্মের সর্বোত্তম উপায়।
ওসকার হলমক্র্যাটজ

3
সলিড (function (undefined) { // undefined is actually undefined here })();
অপরিজ্ঞাত ভেরিওয়াই ভাল

1
@ ইভানমার্মফি এটি ব্যবহার করবেন না, এটি মারাত্মকভাবে পুরানো (আমার উত্তরের শুরুতে নোট দেখুন)।
কনরাড রুডল্ফ

55
if (x.key !== undefined)

আরমিন রোনাচার মনে হয় এরই মধ্যে আমাকে মারধর করেছে তবে:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

একটি নিরাপদ, কিন্তু ধীর সমাধান, যেমন নির্দিষ্ট দ্বারা কনরাড রুডলফ এবং আরমিন Ronacher হবে:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};

2
আমি মনে করি না যে এটি যথেষ্ট ভাল। x.hasOwnProperty('toString') === true;
জো সিমন্স

মতবিরোধ করতে বলছি না, তবে বুঝতে হবে। X.asOwnProperty একটি বুলিয়ান সত্য বা মিথ্যা ছাড়াও কিছু ফেরত দিতে পারে কি এমন কোনও বিন্দু আছে? যদি তা না হয় তবে পোস্ট করা কোডটি প্রতিবার কাজ করা উচিত। আমি মনে করি সম্ভবত যদি পদ্ধতিটি ওভাররাইড করা হত তবে তারপরে, ফলাফলের উপর নির্ভর করা কখনই নির্ভরযোগ্য হবে না যদি আপনি ওভাররাইডিং পদ্ধতিটি না জানেন।
enobrev

1
আমি মনে করি আমাদের একটি ভুল যোগাযোগ রয়েছে। আমি বোঝাতে চাইছি যে আপনার পদ্ধতিটি ব্যবহার করে, এটি বলবে যে 'টু স্ট্রিং' এর নিজস্ব সম্পত্তি, তবে এটি তা নয়।
জো সিমন্স

3
Object.prototypeইতিমধ্যে একটি অন্তর্নির্মিত আছে, সঠিক hasOwnProperty। এটি একটি ভুল বাস্তবায়নের মাধ্যমে ওভাররাইটিং করা (1. সম্পত্তিগুলির মান থাকতে পারে undefined, ২. এটি উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিগুলির জন্য মিথ্যা ধনাত্মকতা দেবে) এটি কেবল একটি গোপনীয় ধারণা। ভুল উত্তরগুলি মুছতে পারে এবং করা উচিত। আমি জানি না আপনি সেপ্টেম্বর'০৮-এ আবার কি করতে পারতেন যখন আপনি রেসিগের উত্তর দেখেছিলেন , তাই এখনই এটি করার পরামর্শ দেওয়ার জন্য মন্তব্য করেছেন।
টিজে ক্রাউডার

36

inকোনও বস্তুর উপর সম্পত্তি বিদ্যমান কিনা তা পরীক্ষা করতে আপনি অপারেটরটি ব্যবহার করতে পারেন :

x = {'key': 1};
alert("key" in x);

আপনি লুপটি ব্যবহার করে অবজেক্টের সমস্ত বৈশিষ্ট্যও লুপ করতে পারেন for - inএবং তারপরে নির্দিষ্ট সম্পত্তিটি পরীক্ষা করতে পারেন:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

আপনাকে অবশ্যই বিবেচনা করতে হবে যদি এই বস্তুর সম্পত্তিটি গুণনীয় হয় বা না হয়, কারণ অ-গুণযোগ্য বৈশিষ্ট্যগুলি একটি for-inলুপে প্রদর্শিত হবে না । এছাড়াও, যদি অগণিত সম্পত্তি প্রোটোটাইপের একটি অ-গণ্যযোগ্য সম্পত্তি ছায়া দিচ্ছে, তবে এটি ইন্টারনেট এক্সপ্লোরার 8 এবং এর আগে প্রদর্শিত হবে না ।

আপনি যদি উদাহরণস্বরূপ সমস্ত গুণাবলীর একটি তালিকা চান তবে তা গণনাযোগ্য বা না হোক আপনি ব্যবহার করতে পারেন

Object.getOwnPropertyNames(x);

এটি কোনও বস্তুতে বিদ্যমান সমস্ত বৈশিষ্ট্যের নামের একটি অ্যারে ফিরিয়ে দেবে।

অবশেষে, আপনি টাইপ অফ অপারেটরটি অবজেক্ট প্রোপার্টিটির ডেটা ধরণের সরাসরি পরীক্ষা করতে ব্যবহার করতে পারেন:

if (typeof x.key == "undefined") {
    alert("undefined");
}

সম্পত্তিটিতে যদি বস্তুর অস্তিত্ব না থাকে তবে এটি স্ট্রিংটিকে অনির্ধারিতভাবে ফিরিয়ে দেবে। অন্যথায় এটি যথাযথ সম্পত্তির ধরণটি ফিরিয়ে দেবে। তবে নোট করুন যে কোনও জিনিসের সম্পত্তি আছে কি নেই তা যাচাই করার জন্য এটি সর্বদা বৈধ উপায় নয়, কারণ আপনার এমন কোনও সম্পত্তি থাকতে পারে যা অনির্ধারিতভাবে সেট করা থাকে, typeof x.keyএক্ষেত্রে ব্যবহার করা এখনও সত্য হয়ে যাবে (যদিও কীটি এখনও রয়েছে অবজেক্টে)।

আপডেট: অপরিজ্ঞাত জাভাস্ক্রিপ্টের সম্পত্তিটির সাথে তুলনা করে কোনও সম্পত্তি রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন

if (x.key === undefined) {
    alert("undefined");
}

undefinedএক্স অবজেক্টে কী নির্দিষ্টভাবে সেট না করা থাকলে এটি কাজ করবে


আপনার আপডেট অংশটি ভুল। দয়া করে এখানে একবার দেখুন: jsfiddle.net/sbgg04yg
945


31

আসুন এখানে কিছু বিভ্রান্তি কাটা। প্রথমে, ধরে নেওয়া সহজ করে তুলিhasOwnProperty ইতিমধ্যে বিদ্যমান রয়েছে ; এটি বর্তমানে প্রচলিত বর্তমান ব্রাউজারগুলির ক্ষেত্রে সত্য।

hasOwnPropertyসত্যটি প্রদান করে যদি এতে প্রবিষ্ট হওয়া নামটি বস্তুতে যুক্ত করা হয়। এটি যথাযথভাবে নির্ধারিত প্রকৃত মূল্য থেকে সম্পূর্ণ স্বাধীন is undefined

অত: পর:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

যাহোক:

var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

সমস্যাটি হ'ল প্রোটোটাইপ চেইনে কোনও অবজেক্টের অপরিজ্ঞাতকৃত মানটির সাথে কোনও বৈশিষ্ট্য থাকলে কী হয়? hasOwnPropertyএটির জন্য মিথ্যা হবে এবং তাই হবে !== undefined। এখনো,for..in এখনও এটি গণনায় তালিকাবদ্ধ করবে।

নীচের লাইনটি কোনও ক্রস-ব্রাউজারের উপায় নেই (যেহেতু ইন্টারনেট এক্সপ্লোরার প্রকাশ করে না __prototype__) এটি নির্ধারণ করার জন্য যে কোনও নির্দিষ্ট সনাক্তকারী কোনও আইটেম বা তার প্রোটোটাইপ শৃঙ্খলে কোনও কিছুর সাথে সংযুক্ত ছিল না।


24

আপনি যদি কোনও সম্পত্তি অনুসন্ধান করছেন, তবে "না"। তুমি চাও:

if ('prop' in obj) { }

প্রোটোটাইপ বা বস্তু থেকে সম্পত্তিটি আসে কিনা আপনার সাধারণভাবে আপনার যত্ন নেওয়া উচিত নয়।

তবে, আপনি আপনার নমুনা কোডটিতে 'কী' ব্যবহার করেছেন বলে মনে হচ্ছে আপনি বস্তুকে হ্যাশ হিসাবে বিবেচনা করছেন, এক্ষেত্রে আপনার উত্তরটি বোঝা যাবে। সমস্ত হ্যাশ কীগুলি বস্তুটির বৈশিষ্ট্য হবে এবং আপনি প্রোটোটাইপের সাহায্যে অতিরিক্ত বৈশিষ্ট্যগুলি এড়াতে পারেন।

জন রেসিগের উত্তরটি খুব ব্যাপক ছিল তবে আমি ভেবেছিলাম এটি পরিষ্কার নয়। বিশেষত কখন "'প্রপ' ব্যবহার করতে হবে তা নিয়ে"।


1
নোট করুন যে inঅপারেটরের দুর্দান্ত ব্রাউজার সমর্থন রয়েছে IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ স্ট্যাকওভারফ্লো.com
অ্যাড্রিয়েন

inঅপারেটরটি ব্যবহারের বিষয়ে অন্য একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে : "এটি সংকীর্ণ অর্থে 'অবজেক্ট' নিয়ে কাজ করে, তাই এটি {as হিসাবে ঘোষিত বা কনস্ট্রাক্টর ব্যবহার করে তৈরি করা হয়, এটি অ্যারে বা আদিমিকে গ্রহণ করে না। এটি নয় যে ওপি এটি প্রয়োজনীয় করেছে, তবে আরও কিছু উত্তর উপস্থিত রয়েছে এমন কৌশলগুলি যা আরও বিস্তৃত (অ্যারে, স্ট্রিং ইত্যাদির সাথে কাজ করুন) "
অ্যাড্রিয়েন

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

16

সাধারণ বস্তুগুলির পরীক্ষার জন্য ব্যবহার করুন: if (obj[x] !== undefined)

কী কী অবজেক্ট টাইপ ব্যবহার করা হয় তা যদি আপনি না জানেন: if (obj.hasOwnProperty(x))

অন্যান্য সমস্ত বিকল্প ধীর ..

বিস্তারিত

নোডেজের অধীনে 100,000,000 চক্রের পারফরম্যান্স মূল্যায়ন এখানে অন্যদের দ্বারা প্রস্তাবিত 5 টি বিকল্পে:

function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }

মূল্যায়ন আমাদের বলে যে আমরা যদি না নির্দিষ্টভাবে অবজেক্টের প্রোটোটাইপ চেইন এবং সেইসাথে অবজেক্টটি নিজেই পরীক্ষা করতে না চাই, আমাদের সাধারণ ফর্মটি ব্যবহার করা উচিত নয়: if (X in Obj)... এটি ব্যবহারের ক্ষেত্রে নির্ভর করে 2 থেকে 6 গুণ কম ধীর হয় is

hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms

নীচের লাইনটি, যদি আপনার ওবজ অগত্যা কোনও সাধারণ অবজেক্ট না হয় এবং আপনি অবজেক্টের প্রোটোটাইপ চেইনটি পরীক্ষা করা এড়াতে চান এবং এক্স সরাসরি ওবজের মালিকানাধীন নিশ্চিত করতে চান, তবে 'if (obj.hasOwnProperty (x)) ...' ব্যবহার করুন।

অন্যথায়, কোনও সাধারণ অবজেক্ট ব্যবহার করার সময় এবং অবজেক্টের প্রোটোটাইপ চেইন সম্পর্কে উদ্বিগ্ন না হয়ে, ব্যবহার if (typeof(obj[x]) !== 'undefined')...করা সবচেয়ে নিরাপদ এবং দ্রুততম উপায়।

আপনি যদি হ্যাশ টেবিল হিসাবে কোনও সাধারণ অবজেক্ট ব্যবহার করেন এবং কখনও কিঙ্কিত কিছু না if (obj[x])...করেন তবে আমি আরও বেশি পঠনযোগ্য বলে আমি এটি ব্যবহার করব।

আনন্দ কর.


15

হ্যাঁ এটি হ'ল :) আমি মনে করি আপনি Object.prototype.hasOwnProperty.call(x, 'key')যা করতে পারেন এটিও কাজ করতে পারে যদি xডাকা সম্পত্তি থাকে hasOwnProperty:)

কিন্তু নিজস্ব সম্পত্তি জন্য পরীক্ষা। যদি এটির কোনও সম্পত্তি রয়েছে যা আপনিও ব্যবহার করতে পারেন যা হেরেডও হতে পারে তা যদি আপনি যাচাই করতে চান typeof x.foo != 'undefined'


14
if (typeof x.key != "undefined") {

}

কারণ

if (x.key)

(উদাহরণস্বরূপ ) এর x.keyসমাধান হলে ব্যর্থ হয় ।falsex.key = ""


সঠিক হবে না। নিম্নলিখিত const x = {key: undefined};সমাধানটি চেষ্টা করুন যা এই সমাধানের সাথে মিথ্যা ফিরে আসবে, যখন x.hasOwnProperty('key')); // trueএবং Reflect.has(x, 'key')); // true। সম্পত্তি আসলে বিদ্যমান, কিন্তু মান হয় undefined
উইল্ট

14

আপনি ES6 Reflectঅবজেক্টটি ব্যবহার করতে পারেন :

x = {'key': 1};
Reflect.has( x, 'key'); // returns true

এমডিএন এর জন্য ডকুমেন্টেশন এখানেReflect.has পাওয়া যাবে

স্থির Reflect.has()পদ্ধতিটি একটি ফাংশন হিসাবে অপারেটরের মতো কাজ করে।


10

ঠিক আছে, দেখে মনে হচ্ছে আমার উত্তরের উত্তর ছিল যদি না আপনি উত্তরাধিকারসূত্রে প্রাপ্ত সম্পত্তিগুলি চান:

if (x.hasOwnProperty('key'))

উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করার জন্য এখানে আরও কিছু বিকল্প রয়েছে:

if (x.key) // Quick and dirty, but it does the same thing as below.

if (x.key !== undefined)

4
ক্যাভেট এক্স.হস ওনপ্রপার্টি ('কী') x.key থাকা অবস্থায় সত্য হতে পারে! == অপরিবর্তিত সত্য নয়।
অ্যান্টনিডব্লু জোনস

4
জন্য পদ্ধতি ভুল হবে। var x = { key: false };x.key
কে কে কোয়ান

2
যদি (x.key) x = {কী: 0} হিসাবে সঠিক না হয় তবে এটি পরীক্ষণটি পাস করবে না।
ব্যবহারকারী

10

এটি করবেন না object.hasOwnProperty(key)), এটি সত্যই খারাপ কারণ এই পদ্ধতিগুলি প্রশ্নযুক্ত বস্তুটির বৈশিষ্ট্যগুলির দ্বারা ছায়াযুক্ত হতে পারে - বিবেচনা করুন { hasOwnProperty: false }- বা, অবজেক্টটি নাল বস্তু হতে পারে (Object.create(null))

সবচেয়ে ভাল উপায় হচ্ছে Object.prototype.hasOwnProperty.call(object, key)বা:

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));

3
আমি এই পদ্ধতির সাথে একমত এবং পারফরম্যান্স বজায় রাখার সময় এটি সবচেয়ে নিরাপদ উপায় হিসাবে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! eslint.org/docs/rules/no-prototype-builtins বলে "উদাহরণস্বরূপ, কোনও ওয়েবসভারের পক্ষে কোনও ক্লায়েন্টের থেকে JSON ইনপুট পার্স করা এবং ফলস্বরূপ অবজেক্টের উপর সরাসরি হ্যানঅনপ্রপার্টি কল করা নিরাপদ হবে, কারণ দূষিত ক্লায়েন্ট একটি JSON মান প্রেরণ করতে পারে যেমন has "hasOwnProperty": 1} এবং সার্ভারকে ক্র্যাশ করার কারণ ঘটায়। "
আরমান

7

অপেক্ষাকৃত সহজ উপায় ব্যবহার করা হচ্ছে Object.keys। এটির একটি ফেরত আসে arrayযার অর্থ আপনি অ্যারের সমস্ত বৈশিষ্ট্য পেয়ে যান।

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

যদিও আমরা দুর্দান্ত ব্রাউজার সমর্থন সহ একটি বিশ্বে আছি। কারণ এই প্রশ্নটি এত পুরানো আমি ভেবেছিলাম আমি এটি যুক্ত করব: এটি জেএস ভি 1.8 হিসাবে ব্যবহার করা নিরাপদ


ঠিক আছে তবে আপনি যদি জানতে চান যে তথ্যের সাথে অন্য কোনও নামে কোনও সম্পত্তি আছে কিনা? যা ভাবছে তা ওপি কী খুঁজছে।
ভিক্টোরিও বেরেরা

2
তারপরে আপনি করতেনObject.keys(info).indexOf('someotherthing') !== -1
হিপ্পিট্রেইল

7

hasOwnProperty "কোনও অবজেক্টের property বস্তুর প্রত্যক্ষ সম্পত্তি হিসাবে নির্দিষ্ট সম্পত্তি আছে কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে; অপারেটরের বিপরীতে , এই পদ্ধতিতে বস্তুর প্রোটোটাইপ শৃঙ্খলা পরীক্ষা করে না।"

সুতরাং সম্ভবত, আপনার প্রশ্নের দ্বারা যা মনে হচ্ছে, আপনি হসঅনপ্রোপার্টি ব্যবহার করতে চান না, যা নির্ধারণ করে যে সম্পত্তিটি সরাসরি বস্তুর সাথে সংযুক্ত হিসাবে উপস্থিত রয়েছে কিনা ,।

আপনি যদি প্রোটোটাইপ চেইনে সম্পত্তিটি বিদ্যমান থাকেন তবে তা নির্ধারণ করতে চান, যেমন:

if( prop in object ){ // do something }

আশা করি এটা কাজে লাগবে.


আমি মাইবজেক্টে 'প্রোপ' অনুসন্ধান করতে 'অপারেটরটিতে' ব্যবহার করতে পারি না "
ভিক্টোরিও

3

ব্যাপক ডাউনভোটিংয়ের ঝুঁকি সহ, একটি নির্দিষ্ট কেসের জন্য এখানে অন্য বিকল্প is :)

আপনি যদি কোনও বিষয়ে সদস্যের জন্য পরীক্ষা করতে চান এবং জানতে চান এটি বাদে অন্য কিছুতে সেট করা হয়েছে কিনা:

  • ''
  • মিথ্যা
  • খালি
  • অনির্দিষ্ট
  • 0 ...

তাহলে আপনি ব্যবহার করতে পারেন:

var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
        // member is set, do something
}

কমপ্যাক্ট এবং সুবিধাজনক
ফ্রেডেরিক উইট

একটি লিটার এটি পছন্দ করবে না: eslint.org/docs/rules/no-extra-boolean-cast
উইল্ট

2

প্রতিবিম্ব সহ ইসিএমএ স্ক্রিপ্ট 6 সমাধান। মোড়ক তৈরি করুন:

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg

আপনি যখন> = ইএস 6 লক্ষ্য করছেন তখন কি এটি করার সর্বোত্তম উপায়?
হিপ্পিট্রাইল

1
ইমো এটি সবচেয়ে সংক্ষিপ্ত এবং সর্বাধিক সহজ উত্তর, তবে সম্ভবত সম্পাদন কোডে সবচেয়ে দ্রুত নয়। কিন্তু গতি কোনও সমস্যা নয় (আর)।
ক্ষতি

2

অবজেক্টে "hasOwnProperty" বিদ্যমান আছে, তবে সরাসরি এই পদ্ধতিটি কল করার পরামর্শ দেওয়া হয় না কারণ কখনও কখনও বস্তুটি শূন্য থাকে বা কিছু সম্পত্তি যেমন বস্তুর উপর উপস্থিত থাকে: { hasOwnProperty: false }

এত ভাল উপায় হবে:

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));


2

আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করতে পারেন-

var obj = {a:1}
console.log('a' in obj)               //1
console.log(obj.hasOwnProperty('a'))  //2
console.log(Boolean(obj.a))         //3

নিম্নলিখিত পদ্ধতির মধ্যে পার্থক্য নিম্নরূপ-

  1. প্রথম এবং তৃতীয় পদ্ধতির মধ্যে আমরা কেবল অবজেক্টে অনুসন্ধান করছি না তবে এর প্রোটোটাইপাল চেইনও। যদি বস্তুর সম্পত্তি না থাকে তবে সম্পত্তিটি তার প্রোটোটাইপ চেইনে উপস্থিত থাকে এটি সত্য হতে চলেছে।

 var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log('b' in obj)
    console.log(Boolean(obj.b))

  1. 2 য় পন্থাটি কেবল তার নিজস্ব সম্পত্তিগুলির জন্য যাচাই করবে। প্রাক্তন -

var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log(obj.hasOwnProperty('b'))

  1. 1 ম এবং তৃতীয়টির মধ্যে পার্থক্যটি যদি এমন কোনও সম্পত্তি থাকে যা অপরিবর্তিত তৃতীয় পদ্ধতির ভ্যালু দেওয়া হয় তবে সত্য সত্য হবে will

var obj = {
      b : undefined
    }
    console.log(Boolean(obj.b))
    console.log('b' in obj);


1

আপনার পদ্ধতিটি ব্যবহার করা দরকার object.hasOwnProperty(property)। এটিতে যদি বস্তুর বৈশিষ্ট্য থাকে এবং সত্যটি যদি বস্তুটি না দেয় তবে এটি সত্য করে।


-1

আপনি যে কীটি পরীক্ষা করছেন তা যদি কোনও ভেরিয়েবলে সংরক্ষণ করা হয় তবে আপনি এটি চেক করে দেখতে পারেন:

x = {'key': 1};
y = 'key';
x[y];

ঠিক কীভাবে এক্স ['কী'] পরীক্ষা করে এটি কীভাবে ভিন্নতর ধারণা দেয়? এবং কীভাবে x.key এর চেয়ে আলাদা? অবশ্যই কোনও অ্যারে অ্যাক্সেস করার পরে ..
জেরার্ড ওনিল

-1

আপনি যখন করতে পারেন তখন অতিরিক্ত জটিল জিনিস কেন:

var isProperty =  (objectname.keyname || "") ? true : false;

বেশিরভাগ ক্ষেত্রে সহজ এবং পরিষ্কার ...


সর্বাধিক সরলতম একটি হ'ল প্রপার্টি = !! অবজেক্টনাম.কিমনাম;
জন

বস্তুটি নীচে থাকলে const objectName = { keyname: false };এটি সত্য হওয়া উচিত, যেহেতু এর keynameসম্পত্তি objectname। মান যেহেতু মিথ্যা তাই এটি এই যুক্তি দিয়ে মিথ্যা ফিরে আসবে।
উইল্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.