টাইপস্ক্রিপ্ট, একটি অভিধানের মাধ্যমে লুপিং


184

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

myDictionary: { [index: string]: any; } = {};

আপনি চেষ্টা করেছেন : for (var key in myDictionary) { }? লুপের অভ্যন্তরে, আপনি keymyDictionary[key]
ইয়ান

@ ইয়ান এটি চেষ্টা করেছেন বলে মনে হচ্ছে না। কোনও ত্রুটি নেই, তবে কিছুই বিবৃতিতে চলে না
ben657

1
@ ইয়ান আহ দুঃখিত, অন্য কোথাও কোথাও কোড এটির সাথে ঝামেলা করছে। এটি পুরোপুরি কাজ করে! এর উত্তর দেওয়ার জন্য যত্নশীল যাতে আমি এটি চয়ন করতে পারি?
ben657

উত্তর:


294

কী / মানগুলি for inলুপ করতে, একটি লুপ ব্যবহার করুন :

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

8
এটি সাধারণভাবে নিরাপদ নয়; এটির হ্যাশঅনপ্রপার্টি পরীক্ষা (জেমি স্টার্কের উত্তরে যেমন) বা অন্য কিছু দরকার।
ডন হ্যাচ

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

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

5
@ আইয়ান সমস্যাটি হ'ল এখানে অনেকগুলি লাইব্রেরি রয়েছে যা অবজেক্ট প্রোটোটাইপগুলিকে সংশোধন করে। যখন আরও ভাল সরল বিকল্প উপস্থিত থাকে, যেমন এই ধরণের প্যাটার্নটির পক্ষে যাওয়া খারাপ ধারণা বলে মনে হয় Object.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });। আপনি যদি এই পদ্ধতিটি অবশ্যই দেখান তবে কমপক্ষে যারা এখনও ভাল জানেন না তাদের জন্য ঝুঁকি এবং আরও ভাল বিকল্পগুলির উল্লেখ করুন।
ইওনা অ্যাপলেট্রি

8
ইতিমধ্যে আমাদের কাছে এস 6 এবং টাইপস্ক্রিপ্ট রয়েছে। সমস্ত সময় লেখার সমস্যাটি কেন অলস থাকে? এমনকি 2017 সালে এবং জেএসে সমস্ত মনোযোগ সহ। আমি তাই হতাশ।
গেরম্যান

168

<ইএস 2017 :

Object.keys(obj).forEach(key => {
  let value = obj[key];
});

> = ইএস 2017 :

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value);
);

এটিই আমি সমাধানটির সন্ধান করছিলাম কারণ এটি আমাকে পুনরাবৃত্তির আগে কীগুলি বাছাই করতে দেয়
অ্যান্ড্রু

এফওয়াইআই, এটি এই মুহুর্তে টাইপস্ক্রিপ্ট খেলার মাঠে সমর্থিত নয়।
Seanny123

1
টাইপস্ক্রিপ্টে কীভাবে কাজ করবেন তা এখানে দেখুনObject.entries
অ্যালেক্স ক্লাউস


66

এ কেমন?

for (let [key, value] of Object.entries(obj)) {
    ...
}

1
Tsconfig এ এটি lib es2017 প্রয়োজন। স্ট্যাকওভারফ্লো.com
স্টাফেন

Obj [কী: স্ট্রিং]: স্ট্রিং as হিসাবে আমি আমার আপত্তি টাইপকে স্পষ্টভাবে সেট করেছি এবং use [কী: স্ট্রিং]: যে কোনও}। এটি দিয়ে আমি কেবল 'মান' অ্যাক্সেস করতে পারি। ধন্যবাদ
ggedde

এবং যদি আপনি উপেক্ষা করতে keyএ সব, সহজভাবে এটিকে ফাঁকা ছেড়ে দিন: [ , value]। ( এই ইস্যু মন্তব্যে ধন্যবাদ ।)
ডোমিনিক

50

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

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

2
চুলগুলি বিভক্ত করার চেষ্টা করা হচ্ছে না, তবে যেহেতু আমরা টাইপ স্ক্রিপ্টের সাথে কথা বলছি, আপনি কি বার কী পরিবর্তে লেট কী ব্যবহার করবেন না? সুন্দর উত্তর আপনাকে ধন্যবাদ।
লুক ডুপিন

3
আসলে, টাইপ স্ক্রিপ্টের বর্তমান সংস্করণ সহ স্ক্রিপ্টটি keyএবং valueহতে পারে const
প্যাট্রিক দেশজার্ডিনস

hasOwnPropertyলক্ষ্য বস্তু থেকে চেকটি কল না করা ভাল , পরিবর্তে এটি করুন: ...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...অন্যথায়, আপনি যদি no-prototype-builtinsনিয়ম সহ এসিলিন্ট ব্যবহার করেন তবে এটি একটি ত্রুটি নির্গত করবে।
sceee

5

সমস্ত অভিধান / অবজেক্টের মান পাওয়ার সংক্ষিপ্ততম উপায়:

Object.keys(dict).map(k => dict[k]);

0

কীগুলি পেতে:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

0

ইয়ানস উত্তরটি ভাল, তবে কীটি ব্যবহারের পরিবর্তে আপনার কনস্ট ব্যবহার করা উচিত কারণ এটি কখনই আপডেট হয় না।

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.