প্রোটোটাইপ ব্যবহার করে জাভাস্ক্রিপ্টে কোনও অবজেক্টের প্রতিটি সম্পত্তির উপর নজর রেখেছেন?


89

প্রোটোটাইপ জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক ব্যবহার করে কোনও সামগ্রীর প্রতিটি সম্পত্তি নিয়ে পুনরাবৃত্তি করার কোনও উপায় আছে কি?

পরিস্থিতি এখানে: আমি জেএসএন-তে একটি এজেএক্স প্রতিক্রিয়া পাচ্ছি যা দেখতে এরকম কিছু দেখাচ্ছে:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

যদি আমি সেই জসন প্রতিক্রিয়াটিকে একটি ভেরিয়েবলের মধ্যে মূল্যায়ন করি তবে আমি কোন সূচকগুলি সত্য এবং কোনটি মিথ্যা তা দেখতে অবজেক্টের responseপ্রতিটি সম্পত্তি নিয়ে পুনরাবৃত্তি করতে সক্ষম হতে চাই response.barobj

প্রোটোটাইপ উভয় হয়েছে Object.keys()এবং Object.values()কিন্তু অদ্ভুত একটি সহজ নেই বলে মনে হয় Object.each()ফাংশন! আমি অবজেক্ট.কিজ () এবং অবজেক্ট.ওয়ালিউস () এর ফলাফলগুলি নিতে পারি এবং অন্যটির মধ্য দিয়ে আমি যখন পুনরাবৃত্তি করি তখন অন্যটিকে ক্রস-রেফারেন্স করতে পারি, তবে এটি এমন হ্যাক যে এটি করার কোনও সঠিক উপায় আছে বলে আমি নিশ্চিত!

উত্তর:


42

আপনাকে প্রথমে আপনার অবজেক্টকে আক্ষরিক একটি প্রোটোটাইপ হ্যাশ রূপান্তর করতে হবে :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

পারফেক্ট! আমি ঠিক এটিই খুঁজছিলাম।
ওভারলোডআউট

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

4
প্রশ্নকারীরা প্রোটোটাইপ (বা প্রশ্ন সম্পাদিত হয়েছিল?) উল্লেখ করেননি? যাইহোক এটি সব ভাল
ইমুরানো

বাহ্যিক গ্রন্থাগারটি লোড করার দরকার নেই
হেলকিস

553

এখানে প্রোটোটাইপের দরকার নেই: জাভাস্ক্রিপ্টের for..inলুপ রয়েছে। যদি আপনি নিশ্চিত না হন যে কারও সাথেই গোলযোগ নেই, তবে পাশাপাশি Object.prototypeপরীক্ষা করুনhasOwnProperty()

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
অযাচিত লাইব্রেরি লোড করতে বাধ্য না করে প্রকৃত উত্তরের জন্য আপনাকে ধন্যবাদ।

8
এটি কঠোর উত্তর নয়। প্রশ্নগুলি বলে যে প্রোটোটাইপ ব্যবহার করতে হবে! পছন্দের স্বাধীনতা - হাহা ...
সোভেন লারসন

4
এই প্রশ্নের মূল শিরোনামে প্রোটোটাইপ উল্লেখ করা হয়েছে, যা আমি স্বচ্ছতার জন্য আবার যুক্ত করেছি। এই প্রশ্নটি দেহের একেবারে প্রথম লাইনের প্রমাণ হিসাবে, বিশেষত এমন একটি পরিবেশ সম্পর্কে জিজ্ঞাসা করছিল যেখানে প্রোটোটাইপ ব্যবহৃত হচ্ছে use
ওভারলোডআউট

4
আপনি যত বেশি জাভাস্ক্রিপ্ট লিখবেন, ততই আপনি forলুপগুলি লেখার পক্ষে ঘৃণা করবেন :)
ট্রিপটিচ

13
দুর্ভাগ্যক্রমে এই প্রশ্নটি পপ আপ হয় যে আপনি যদি "প্রতিটি বস্তুর সম্পত্তি জাভাস্ক্রিপ্টের উপরে পুনরাবৃত্তি করবেন" এর মতো কোনও কিছুর জন্য গুগল করেন, সুতরাং এখানে আসার প্রচুর লোক সম্ভবত এই প্রশ্নের উত্তর খুঁজছেন। তারা যে প্রশ্নটি চায় তা হ'ল: স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ৯২২২78৯৯/২ , যার অবজেক্ট লিটারেলের সাথে সত্যিকারের কোনও যোগসূত্র নেই।
বাক্সিসিমো

0

আপনার কীগুলির মাধ্যমে পুনরাবৃত্তি হওয়া উচিত এবং বর্গাকার বন্ধনী ব্যবহার করে মানগুলি পাওয়া উচিত।

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

সম্পাদনা: স্পষ্টতই, এটি প্রশ্নটিকে একটি সদৃশ করে তোলে।


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

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

4
@ ওভারলোডআউট: আপনি যথেষ্ট যত্ন সহকারে পড়েন নি: এটি অ্যারের বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করতে নিরুৎসাহিত করা হয়েছে, সরল বস্তু নয়
ক্রিস্টোফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.