কেন জাভাস্ক্রিপ্টে অবজেক্টগুলি পরিলক্ষিত হয় না?


87

ডিফল্টরূপে অবজেক্টগুলি কেন পুনরুক্তিযোগ্য নয়?

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

ES6 এর মতো বিবৃতিগুলি for...ofডিফল্টরূপে অবজেক্টগুলির জন্য ব্যবহার করা ভাল। যেহেতু এই বৈশিষ্ট্যগুলি কেবলমাত্র বিশেষ "পুনরাবৃত্তিযোগ্য অবজেক্টস" এর জন্য উপলব্ধ যার মধ্যে {}অবজেক্টগুলি অন্তর্ভুক্ত নয় , তাই আমরা এটি ব্যবহার করতে চাইলে অবজেক্টগুলির জন্য এই কাজটি করতে হুপের মধ্য দিয়ে যেতে হবে।

বিবৃতিটির জন্য ... পুনরাবৃত্তিযোগ্য বস্তুর (অ্যারে, মানচিত্র, সেট, আর্গুমেন্ট অবজেক্ট এবং আরও কিছু সহ) লুপ তৈরি করে ...

উদাহরণস্বরূপ একটি ES6 জেনারেটর ফাংশন ব্যবহার করে :

var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};

function* entries(obj) {
   for (let key of Object.keys(obj)) {
     yield [key, obj[key]];
   }
}

for (let [key, value] of entries(example)) {
  console.log(key);
  console.log(value);
  for (let [key, value] of entries(value)) {
    console.log(key);
    console.log(value);
  }
}

উপরেরগুলি ফায়ারফক্সে কোড চালনা করার সময় আমি এটির প্রত্যাশা অনুযায়ী সঠিকভাবে লগ করেছি (যা ES6 সমর্থন করে ):

হ্যাকির আউটপুট ... এর জন্য

ডিফল্টরূপে, {}অবজেক্টগুলি পুনরাবৃত্ত হয় না তবে কেন? অসুবিধাগুলি পুনরুক্তিযোগ্য বস্তুর সম্ভাব্য সুবিধার ছাড়িয়ে যাবে? এর সাথে জড়িত বিষয়গুলি কী কী?

উপরন্তু, কারণ {}বস্তু "অ্যারে-মত" সংগ্রহগুলি এবং থেকে ভিন্ন "iterable বস্তু" যেমন NodeList, HtmlCollectionএবং argumentsতারা অ্যারেগুলির রূপান্তরিত করা যাবে না।

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

var argumentsArray = Array.prototype.slice.call(arguments);

বা অ্যারে পদ্ধতিগুলির সাথে ব্যবহার করুন:

Array.prototype.forEach.call(nodeList, function (element) {})

আমার উপরের প্রশ্নগুলি ছাড়াও, কীভাবে {}পুনরাবৃত্তগুলিতে জিনিসগুলি তৈরি করতে হয় তার একটি কার্যকারী উদাহরণ দেখতে বিশেষত যারা উল্লেখ করেছেন তাদের কাছ থেকে আমি দেখতে পছন্দ করব [Symbol.iterator]এটি এই নতুন {}"পুনরাবৃত্তিযোগ্য অবজেক্টস" এর মতো বিবৃতি ব্যবহার করার অনুমতি দেয় for...of। এছাড়াও, আমি অবাক করে দিয়েছি যে জিনিসগুলিকে পুনরাবৃত্ত করে তোলা তাদের এ্যারে রূপান্তরিত করতে দেয়।

আমি নীচের কোডটি চেষ্টা করেছি, তবে আমি একটি পেয়েছি TypeError: can't convert undefined to object

var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};

// I want to be able to use "for...of" for the "example" object.
// I also want to be able to convert the "example" object into an Array.
example[Symbol.iterator] = function* (obj) {
   for (let key of Object.keys(obj)) {
     yield [key, obj[key]];
   }
};

for (let [key, value] of example) { console.log(value); } // error
console.log([...example]); // error

4
যেকোনো কিছু একটি আছে যা Symbol.iteratorসম্পত্তি একটি iterable হয়। সুতরাং আপনি ঠিক যে সম্পত্তি বাস্তবায়ন করতে চাই। কেন বস্তুগুলি পুনরাবৃত্তিযোগ্য নয় তার একটি সম্ভাব্য ব্যাখ্যা হ'ল এটি বোঝাতে পারে যে সমস্ত কিছু পুনরাবৃত্ত ছিল, যেহেতু সবকিছুই একটি বস্তু (অবশ্যই আদিম বাদে)। যাইহোক, কোনও ফাংশন বা নিয়মিত অভিব্যক্তি অবজেক্টের মাধ্যমে পুনরাবৃত্তি করার অর্থ কী?
ফেলিক্স ক্লিং

7
আপনার আসল প্রশ্ন এখানে কি? ইসিএমএ কেন সিদ্ধান্ত নিয়েছিল?
স্টিভ বনেট

4
যেহেতু বস্তুগুলির তাদের সম্পত্তিগুলির কোনও গ্যারান্টিযুক্ত অর্ডার নেই, তাই আমি অবাক হয়েছি যে এটি যদি কোনও পুনরাবৃত্তির সংজ্ঞা থেকে বিরত হয় যা আপনি প্রত্যাশাযোগ্য আদেশের প্রত্যাশা করবেন?
jender00

4
"কেন" এর জন্য একটি অনুমোদনমূলক
ফেলিক্স ক্লিং

4
@ ফেলিক্সকলিং - এই পোস্টটি কি ইএস 6 সম্পর্কে? আপনি কোন সংস্করণটির কথা বলছেন তা সম্ভবত এটি সম্পাদনা করা উচিত কারণ "ECMAScript এর আসন্ন সংস্করণ" সময়ের সাথে খুব ভাল কাজ করে না।
jفر00

উত্তর:


42

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

for...ofপ্রথম স্থানটিতে একটি নির্মাণ কেন যুক্ত করবেন ?

জাভাস্ক্রিপ্ট ইতিমধ্যে একটি for...inনির্মাণ অন্তর্ভুক্ত যা একটি বস্তুর বৈশিষ্ট্য পুনরাবৃত্তি করতে ব্যবহার করা যেতে পারে। যাইহোক, এটি সত্যই কোনও ফর লুপ নয় , কারণ এটি কোনও সামগ্রীর সমস্ত বৈশিষ্ট্যকে গণনা করে এবং কেবল সাধারণ ক্ষেত্রে কেবল অনুমানযোগ্যভাবে কাজ করে।

এটি আরও জটিল ক্ষেত্রে বিভক্ত হয়ে যায় (অ্যারে সহ, যেখানে এর ব্যবহারটি হ'লfor...in অ্যারে দিয়ে সঠিকভাবে ব্যবহারের জন্য প্রয়োজনীয় সুরক্ষাকারীদের দ্বারা নিরুৎসাহিত করা বা পুঙ্খানুপুঙ্খভাবে বিস্মৃত হয় )। আপনি এটি ব্যবহার করে চারপাশে কাজ করতে পারেনhasOwnProperty(অন্যান্য জিনিসের মধ্যে) তবে এটি কিছুটা আড়ম্বরপূর্ণ এবং অদৃশ্য।

সুতরাং আমার ধারনাটি হ'ল for...ofকনস্ট্রাক্টটি নির্মাণের সাথে যুক্ত ঘাটতিগুলি সমাধান করার জন্য যুক্ত করা হচ্ছে for...inএবং জিনিসগুলি পুনরাবৃত্ত করার সময় বৃহত্তর ইউটিলিটি এবং নমনীয়তা সরবরাহ করে। লোকেরা for...inএমন একটি forEachলুপ হিসাবে বিবেচনা করে যা সাধারণত যে কোনও সংগ্রহের জন্য প্রয়োগ করা যেতে পারে এবং যে কোনও সম্ভাব্য প্রেক্ষাপটে বুদ্ধিমান ফলাফল আনতে পারে, তবে তা ঘটে না। for...ofলুপ সংশোধন করা হয়েছে যে।

আমি এটিও ধরে নিয়েছি যে বিদ্যমান ES5 কোডটি ES6 এর অধীনে চালিত হওয়া এবং ES5 এর অধীনে একই ফলাফল উত্পন্ন করার জন্য এটি গুরুত্বপূর্ণ, সুতরাং ব্রেকিং পরিবর্তনগুলি করা যায় না, উদাহরণস্বরূপ, আচরণের ক্ষেত্রে for...in নির্মাণের

2. কিভাবে for...ofকাজ করে?

রেফারেন্স ডকুমেন্টেশন এই অংশের জন্য দরকারী। বিশেষত, কোনও বিষয় বিবেচনা করা হয় iterableযদি এটি Symbol.iteratorসম্পত্তিটি নির্ধারণ করে considered

সম্পত্তি-সংজ্ঞাটি এমন একটি ফাংশন হওয়া উচিত যা সংগ্রহের আইটেমগুলি একে একে এক করে ফেরত দেয় এবং আরও একটি আইটেম আনতে হবে কিনা তা নির্দেশ করে একটি পতাকা সেট করে। পূর্বনির্ধারিত বাস্তবায়নগুলি কিছু অবজেক্ট-প্রকারের জন্য সরবরাহ করা হয় এবং এটি অপেক্ষাকৃত স্পষ্ট যে for...ofকেবল পুনরাবৃত্তকারী ফাংশনে প্রতিনিধি ব্যবহার করে।

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

ব্যবহারিক অ-ইস্যুগুলি বাদ দিয়ে, এটি একটি নতুন পূর্বনির্ধারিত সম্পত্তি দিয়ে সমস্ত অবজেক্টটি শুরু করার জন্য, বা স্পষ্টভাবে বলতে হবে যে "প্রতিটি বস্তু একটি সংগ্রহ"।

৩. কেন অবজেক্টগুলি ডিফল্টরূপে iterableব্যবহার করছে না for...of?

আমার অনুমান যে এটি একটি সংমিশ্রণ:

  1. iterableডিফল্টরূপে সমস্ত বস্তু তৈরি করা অগ্রহণযোগ্য বলে বিবেচিত হতে পারে কারণ এটি এমন একটি সম্পত্তি যুক্ত করে যেখানে আগে ছিল না, বা কোনও বস্তু (প্রয়োজনীয়ভাবে) সংগ্রহ নয়। যেমন ফেলিক্স নোট করেছেন, "কোনও ফাংশন বা নিয়মিত এক্সপ্রেশন অবজেক্টের উপর পুনরাবৃত্তি করার অর্থ কী"?
  2. সরল অবজেক্টগুলি ইতিমধ্যে ব্যবহার করে পুনরাবৃত্তি করা যেতে পারে for...in, এবং এটি অন্তর্নির্মিত পুনরুদ্ধারক প্রয়োগটি বিদ্যমান for...inআচরণের চেয়ে আলাদাভাবে / ভাল কী করতে পারে তা পরিষ্কার নয় । সুতরাং যদি # 1 টি ভুল হয় এবং সম্পত্তি যুক্ত করা গ্রহণযোগ্য ছিল, তবে এটি দরকারী হিসাবে দেখা যায় নি ।
  3. ব্যবহারকারীরা যাঁর জিনিসগুলি তৈরি iterableকরতে চান তারা Symbol.iteratorসম্পত্তি সংজ্ঞা দিয়ে সহজেই তা করতে পারেন ।
  4. ES6 বৈশিষ্ট একটি উপলব্ধ ম্যাপ ধরন, যা হয় iterable ডিফল্টরূপে এবং যেমন একটি প্লেইন বস্তুর ব্যবহার কিছু অন্যান্য ছোট সুফল রয়েছে Map

রেফারেন্স ডকুমেন্টেশনে # 3 এর জন্য একটি উদাহরণ সরবরাহ করা আছে:

var myIterable = {};
myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};

for (var value of myIterable) {
    console.log(value);
}

প্রদত্ত যে অবজেক্টগুলি সহজেই তৈরি করা যায় iterable, এটি ব্যবহার করে ইতিমধ্যে পুনরাবৃত্তি করা যেতে পারে for...inএবং কোনও ডিফল্ট অবজেক্টের পুনরাবৃত্তিটি কী করা উচিত তার বিষয়ে স্পষ্ট চুক্তি নেই (এটি যদি করে তবে বোঝায় যে এটি যা কিছু করে তার থেকে আলাদা হবে for...in), এটি যুক্তিসঙ্গত বলে মনে হয় iterableডিফল্টরূপে বস্তুগুলি তৈরি করা হয়নি enough

মনে রাখবেন যে আপনার উদাহরণ কোডটি আবার ব্যবহার করে এটি ব্যবহার করা যেতে পারে for...in:

for (let levelOneKey in object) {
    console.log(levelOneKey);         //  "example"
    console.log(object[levelOneKey]); // {"random":"nest","another":"thing"}

    var levelTwoObj = object[levelOneKey];
    for (let levelTwoKey in levelTwoObj ) {
        console.log(levelTwoKey);   // "random"
        console.log(levelTwoObj[levelTwoKey]); // "nest"
    }
}

... বা আপনি iterableনিম্নলিখিত বিষয়গুলির মতো কিছু করে নিজের ইচ্ছাকে নিজের মতো করে তৈরি করতে পারেন (বা পরিবর্তে বরাদ্দ করে আপনি সমস্ত বস্তু তৈরি করতে পারেন ):iterableObject.prototype[Symbol.iterator]

obj = { 
    a: '1', 
    b: { something: 'else' }, 
    c: 4, 
    d: { nested: { nestedAgain: true }}
};

obj[Symbol.iterator] = function() {
    var keys = [];
    var ref = this;
    for (var key in this) {
        //note:  can do hasOwnProperty() here, etc.
        keys.push(key);
    }

    return {
        next: function() {
            if (this._keys && this._obj && this._index < this._keys.length) {
                var key = this._keys[this._index];
                this._index++;
                return { key: key, value: this._obj[key], done: false };
            } else {
                return { done: true };
            }
        },
        _index: 0,
        _keys: keys,
        _obj: ref
    };
};

আপনি এটির সাথে এখানে খেলতে পারেন (ক্রোমে, ইজারা নিয়ে): http://jsfiddle.net/rncr3ppz/5/

সম্পাদনা করুন

এবং আপনার আপডেট হওয়া প্রশ্নের জবাবে হ্যাঁ, ES6 iterableস্প্রেড অপারেটরটি ব্যবহার করে একটি অ্যারেতে রূপান্তর করা সম্ভব ।

তবে এটি এখনও ক্রোমে কাজ করছে বলে মনে হয় না, বা কমপক্ষে আমি এটি আমার জেএসফিডেলে কাজ করতে পারি না। তত্ত্বের ক্ষেত্রে এটি এতটা সহজ হওয়া উচিত:

var array = [...myIterable];

শুধু obj[Symbol.iterator] = obj[Symbol.enumerate]আপনার শেষ উদাহরণে না কেন ?
বার্গি

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

ওহো, [[enumerate]]একটি সুপরিচিত প্রতীক নয় (@@ গণনা করা) তবে অভ্যন্তরীণ পদ্ধতি। আমার হতে হবেobj[Symbol.iterator] = function(){ return Reflect.enumerate(this) }
বার্গি

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

4
ভাল পয়েন্ট আবার জোর দেওয়া যে প্রতিটি বস্তু একটি সংগ্রহ নয়। অবজেক্টগুলি দীর্ঘ সময়ের জন্য যেমন ব্যবহার করা হয়, কারণ এটি খুব সুবিধাজনক ছিল তবে শেষ পর্যন্ত তারা আসলে সংগ্রহ নয়। Mapআপাতত আমাদের যা আছে
ফেলিক্স ক্লিং

9

Objects খুব ভাল কারণে জাভাস্ক্রিপ্টে পুনরাবৃত্তির প্রোটোকলগুলি প্রয়োগ করে না। দুটি স্তর রয়েছে যেখানে জাভাস্ক্রিপ্টে বস্তুর বৈশিষ্ট্যগুলি পুনরাবৃত্তি করা যেতে পারে:

  • প্রোগ্রাম স্তর
  • তথ্য স্তর

প্রোগ্রাম স্তর Iteration

আপনি যখন প্রোগ্রাম পর্যায়ে কোনও বস্তুর উপর পুনরাবৃত্তি করেন আপনি আপনার প্রোগ্রামের কাঠামোর একটি অংশ পরীক্ষা করেন। এটি একটি প্রতিফলিত অপারেশন। আসুন এই স্টেটমেন্টটি অ্যারে টাইপের সাথে চিত্রিত করুন, যা সাধারণত ডেটা স্তরে পুনরাবৃত্তি হয়:

const xs = [1,2,3];
xs.f = function f() {};

for (let i in xs) console.log(xs[i]); // logs `f` as well

আমরা কেবলমাত্র এর প্রোগ্রাম স্তরটি পরীক্ষা করেছি xs। অ্যারে যেহেতু ডেটা সিকোয়েন্সগুলি সঞ্চয় করে, আমরা নিয়মিত কেবলমাত্র ডেটা স্তরে আগ্রহী। for..inস্পষ্টতই বেশিরভাগ ক্ষেত্রে অ্যারে এবং অন্যান্য "ডেটা-ভিত্তিক" কাঠামোর সাথে কোনও সম্পর্ক নেই। এই কারণেই ES2015 চালু হয়েছে for..ofএবং পুনরাবৃত্ত প্রোটোকল।

ডেটা স্তরের আইট্রেশন

এর অর্থ কি এই যে আমরা আদিম ধরণের থেকে ফাংশনগুলি আলাদা করে প্রোগ্রাম স্তর থেকে ডেটা আলাদা করতে পারি? না, কারণ ফাংশনগুলি জাভাস্ক্রিপ্টে ডেটাও হতে পারে:

  • Array.prototype.sort উদাহরণস্বরূপ কোনও ফাংশনটি একটি নির্দিষ্ট ধরণের অ্যালগরিদম সম্পাদন করে
  • থাঙ্কস হ'ল () => 1 + 2অলসভাবে মূল্যায়িত মানগুলির জন্য কেবল কার্যকরী র‌্যাপার

আদিম মানগুলি পাশাপাশি প্রোগ্রামের স্তরের প্রতিনিধিত্ব করতে পারে:

  • [].lengthউদাহরণস্বরূপ একটি Numberতবে অ্যারের দৈর্ঘ্য উপস্থাপন করে এবং এটি প্রোগ্রাম ডোমেনের অন্তর্গত

এর অর্থ হ'ল আমরা কেবল প্রকারগুলি পরীক্ষা করে প্রোগ্রাম এবং ডেটা স্তরটিকে আলাদা করতে পারি না।


এটি বোঝা গুরুত্বপূর্ণ যে সাধারণ পুরানো জাভাস্ক্রিপ্ট অবজেক্টের জন্য পুনরাবৃত্তি প্রোটোকলগুলির প্রয়োগ ডেটা স্তরের উপর নির্ভর করবে। তবে আমরা যেমনটি দেখেছি, ডেটা এবং প্রোগ্রাম স্তর পুনরাবৃত্তির মধ্যে একটি নির্ভরযোগ্য পার্থক্য সম্ভব নয়।

এর সাথে Arrayএই পার্থক্যটি নগণ্য: পূর্ণসংখ্যার মতো কী সহ প্রতিটি উপাদান একটি ডেটা উপাদান। Objectএর একটি সমতুল্য বৈশিষ্ট্য রয়েছে: enumerableবর্ণনাকারী। তবে আসলেই কি এটার উপর নির্ভর করা বাঞ্ছনীয়? আমি বিশ্বাস করি না! enumerableবর্ণনাকারীর অর্থ খুব ঝাপসা।

উপসংহার

বস্তুর জন্য পুনরাবৃত্তি প্রোটোকলগুলি প্রয়োগ করার কোনও অর্থবহ উপায় নেই, কারণ প্রতিটি বস্তু একটি সংগ্রহ নয়।

যদি অবজেক্টের বৈশিষ্ট্যগুলি ডিফল্টরূপে পুনর্ব্যক্ত হয় তবে প্রোগ্রাম এবং ডেটা স্তর মিশ্রিত হত। যেহেতু জাভাস্ক্রিপ্টে প্রতিটি সমন্বিত প্রকার সরল বস্তুর উপর ভিত্তি করে এটি প্রযোজ্য হবে Arrayএবং Mapপাশাপাশি।

for..in, Object.keys, Reflect.ownKeysইত্যাদি উভয় প্রতিফলন এবং তথ্য পুনরাবৃত্তির জন্য ব্যবহার করা যেতে পারে একটি পরিষ্কার পার্থক্য নিয়মিতভাবে সম্ভব নয়। আপনি যদি সাবধান না হন তবে আপনি মেটা প্রোগ্রামিং এবং অদ্ভুত নির্ভরতা নিয়ে দ্রুত শেষ করবেন। Mapবিমূর্ত ডাটা টাইপ কার্যকরভাবে প্রোগ্রাম ও ডাটা স্তরের conflating শেষ। আমি বিশ্বাস করি Mapযে ES2015-এ সর্বাধিক উল্লেখযোগ্য অর্জন, এমনকি এসগুলি Promiseআরও বেশি আকর্ষণীয় হলেও ।


4
+1, আমি মনে করি "বস্তুর জন্য পুনরাবৃত্তির প্রোটোকলগুলি প্রয়োগ করার কোনও অর্থবহ উপায় নেই, কারণ প্রতিটি বস্তু একটি সংগ্রহ নয়।" এটির পরিমাণ
চার্লি শ্লিয়েসার

4
আমি মনে করি না যে এটি একটি ভাল যুক্তি। যদি আপনার অবজেক্ট কোনও সংগ্রহ না হয় তবে আপনি কেন এটি লুপ করার চেষ্টা করছেন? এটি কোনও ব্যাপার নয় যে প্রতিটি বস্তু একটি সংগ্রহ নয়, কারণ আপনি যেগুলি নেই তার উপর পুনরাবৃত্তি করার চেষ্টা করবেন না।
বিটি

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

এই যুক্তিটি যে প্রতিটি বস্তু একটি সংগ্রহ নয় তা বোঝায় না। আপনি ধরে নিচ্ছেন যে একজন পুনরাবৃত্তির কেবল একটি উদ্দেশ্য রয়েছে (একটি সংগ্রহ পুনরাবৃত্তি করা)। কোনও বস্তুর ডিফল্ট পুনরাবৃত্তকারী হ'ল বস্তুর বৈশিষ্ট্যগুলির একটি পুনরাবৃত্তকারী হবে properties এই বৈশিষ্ট্যগুলি যা উপস্থাপন করে তা নির্বিশেষে (কোনও সংগ্রহ বা অন্য কিছু হোক)। ম্যানগো যেমন বলেছিল, যদি আপনার অবজেক্টটি কোনও সংগ্রহকে প্রতিনিধিত্ব না করে, তবে প্রোগ্রামারটিকে এটি কোনও সংগ্রহের মতো আচরণ না করার পক্ষে। সম্ভবত তারা কিছু ডিবাগ আউটপুটের জন্য বস্তুর বৈশিষ্ট্যগুলি পুনরাবৃত্তি করতে চান? সংগ্রহ ছাড়াও প্রচুর অন্যান্য কারণ রয়েছে।
jفر00

8

আমি অনুমান করি প্রশ্নটি হওয়া উচিত "কেন কোনও বিল্ট-ইন অবজেক্টের পুনরাবৃত্তি নেই?

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

function* iterate_object(o) {
    var keys = Object.keys(o);
    for (var i=0; i<keys.length; i++) {
        yield [keys[i], o[keys[i]]];
    }
}

তারপর

for (var [key, val] of iterate_object({a: 1, b: 2})) {
    console.log(key, val);
}

a 1
b 2

4
ধন্যবাদ থ্রাজাবুরো আমি আমার প্রশ্নটি সংশোধন করেছি আমি যেমন ব্যবহার করে একটি উদাহরণ দেখতে চাই [Symbol.iterator]আপনি যদি সেই অনিচ্ছাকৃত পরিণতি সম্পর্কে প্রসারিত করতে পারেন তবে।
বুমবক্স 8

4

আপনি বিশ্বব্যাপী সমস্ত বস্তুকে সহজেই পুনরাবৃত্ত করতে পারবেন:

Object.defineProperty(Object.prototype, Symbol.iterator, {
    enumerable: false,
    value: function * (){
        for(let key in this){
            if(this.hasOwnProperty(key)){
                yield [key, this[key]];
            }
        }
    }
});

4
দেশীয় বস্তুগুলিতে বিশ্বব্যাপী পদ্ধতি যুক্ত করবেন না। এটি একটি ভয়ঙ্কর ধারণা যা আপনাকে এবং যে কেউ আপনার কোড ব্যবহার করে, গাধাতে কামড় দেবে।
বিটি

2

এটি সর্বশেষতম পদ্ধতি (যা ক্রোম ক্যানারিতে কাজ করে)

var files = {
    '/root': {type: 'directory'},
    '/root/example.txt': {type: 'file'}
};

for (let [key, {type}] of Object.entries(files)) {
    console.log(type);
}

হ্যাঁ entriesএখন একটি পদ্ধতি অবজেক্টের অংশ হয়ে গেছে :)

সম্পাদনা করুন

এটি আরও দেখার পরে মনে হয় আপনি নিম্নলিখিতগুলি করতে পারেন

Object.prototype[Symbol.iterator] = function * () {
    for (const [key, value] of Object.entries(this)) {
        yield {key, value}; // or [key, value]
    }
};

সুতরাং আপনি এখন এটি করতে পারেন

for (const {key, value:{type}} of files) {
    console.log(key, type);
}

edit2

আপনার আসল উদাহরণে ফিরে যান, আপনি উপরের প্রোটোটাইপ পদ্ধতিটি ব্যবহার করতে চাইলে এটি এটি পছন্দ করতে পারে

for (const {key, value:item1} of example) {
    console.log(key);
    console.log(item1);
    for (const {key, value:item2} of item1) {
        console.log(key);
        console.log(item2);
    }
}

2

আমিও এই প্রশ্নে বিরক্ত হয়েছি।

তারপরে আমি ব্যবহার করার একটি ধারণা নিয়ে এসেছি Object.entries({...}), এটি একটি Arrayযা ফিরে আসেIterable

এছাড়াও, ডাঃ অ্যাক্সেল রাউশমায়ার এ সম্পর্কে একটি দুর্দান্ত উত্তর পোস্ট করেছেন। কেন সরল বস্তুগুলি পুনরাবৃত্ত হয় না তা দেখুন


0

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

var iterableProperties={
    enumerable: false,
    value: function * () {
        for(let key in this) if(this.hasOwnProperty(key)) yield this[key];
    }
};

var fruit={
    'a': 'apple',
    'b': 'banana',
    'c': 'cherry'
};
Object.defineProperty(fruit,Symbol.iterator,iterableProperties);
for(let v of fruit) console.log(v);

এটি হওয়া উচিত ঠিক ততটা সুবিধাজনক নয়, তবে এটি কার্যক্ষম, বিশেষত আপনার যদি একাধিক অবজেক্ট থাকে:

var instruments={
    'a': 'accordion',
    'b': 'banjo',
    'c': 'cor anglais'
};
Object.defineProperty(instruments,Symbol.iterator,iterableProperties);
for(let v of instruments) console.log(v);

এবং, যেহেতু প্রত্যেকেই একটি মতামতের অধিকারী, আমি দেখতে পাচ্ছি না কেন কেন বস্তুগুলি ইতিমধ্যে পুনরুক্ত হয় না। যদি আপনি তাদের উপরের মতো পলিফিল করতে পারেন বা ব্যবহার করুনfor … in করতে তবে আমি একটি সহজ যুক্তি দেখতে পাচ্ছি না।

একটি সম্ভাব্য পরামর্শ হ'ল যা পুনরাবৃত্তিযোগ্য তা হ'ল এক ধরণের অবজেক্ট, সুতরাং এটি সম্ভব যে অন্য কিছু বস্তুর প্রয়াসে বিস্ফোরিত হওয়ার ক্ষেত্রে পুনরুক্তযোগ্য বস্তুর একটি উপসেটে সীমাবদ্ধ থাকবে।

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