প্রকারের মানচিত্রের উপরে আইট্রেট করা


134

আমি একটি টাইপ স্ক্রিপ্ট মানচিত্রে পুনরাবৃত্তি করার চেষ্টা করছি কিন্তু আমি ত্রুটিগুলি পেতে থাকি এবং এ জাতীয় তুচ্ছ সমস্যার জন্য আমি এখনও কোনও সমাধান পাইনি।

আমার কোডটি হ'ল:

myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
   console.log(key);
}

এবং আমি ত্রুটি পেয়েছি:

টাইপ 'IterableIteratorSim <[স্ট্রিং, বুলিয়ান]>' কোনও অ্যারে টাইপ বা স্ট্রিং টাইপ নয়।

সম্পূর্ণ স্ট্যাক ট্রেস:

 Error: Typescript found the following errors:
  /home/project/tmp/broccoli_type_script_compiler-input_base_path-q4GtzHgb.tmp/0/src/app/project/project-data.service.ts (21, 20): Type 'IterableIteratorShim<[string, boolean]>' is not an array type or a string type.
    at BroccoliTypeScriptCompiler._doIncrementalBuild (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:115:19)
    at BroccoliTypeScriptCompiler.build (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:43:10)
    at /home/project/node_modules/broccoli-caching-writer/index.js:152:21
    at lib$rsvp$$internal$$tryCatch (/home/project/node_modules/rsvp/dist/rsvp.js:1036:16)
    at lib$rsvp$$internal$$invokeCallback (/home/project/node_modules/rsvp/dist/rsvp.js:1048:17)
    at lib$rsvp$$internal$$publish (/home/project/node_modules/rsvp/dist/rsvp.js:1019:11)
    at lib$rsvp$asap$$flush (/home/project/node_modules/rsvp/dist/rsvp.js:1198:9)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

আমি কৌণিক-ক্লিপ বিটা 5 এবং টাইপস্ক্রিপ্ট 1.8.10 ব্যবহার করছি এবং আমার লক্ষ্য এস 5 কারও কি এই সমস্যা আছে?


4
GitHub থেকে এই উত্তর দেখুন github.com/Microsoft/TypeScript/issues/...
yurzui

উত্তর:


210

Map.prototype.forEach((value, key, map) => void, thisArg?) : voidপরিবর্তে আপনি ব্যবহার করতে পারেন

এটি এর মতো ব্যবহার করুন:

myMap.forEach((value: boolean, key: string) => {
    console.log(key, value);
});

15
শুধু এই মধ্যে দৌড়ে। দেখে মনে হচ্ছে না টাইপস্ক্রিপ্ট মানচিত্রের পুনরাবৃত্তির জন্য বিশেষকে সম্মান করছে, অন্তত এমডিএন অনুসারে যা একটি লুপের জন্য নির্দিষ্ট করে। .forEachউপ-অনুকূল, যেহেতু আপনি এটি ভাঙতে পারবেন না,
আফাইক

14
dunno কেন তার মান তারপর কী। পিছনে মনে হচ্ছে।
পল রুনি

সম্ভবত দিয়ে একতান @PaulRooney এটা যে মত Array.prototype.map
আহমেদ ফসিহ

1
আমাদের প্রয়োজনের সন্ধান পেলে এই পুনরাবৃত্তি প্রক্রিয়াটি কীভাবে বন্ধ করা যায়?
জাভাআরুনার


36

Array.from()এটিকে রূপান্তর করতে কেবল পদ্ধতিটি ব্যবহার করুন Array:

myMap : Map<string, boolean>;
for(let key of Array.from( myMap.keys()) ) {
   console.log(key);
}

5
মানচিত্রকে রূপান্তর করা খুব কার্য সম্পাদনের ক্ষুধার্ত ক্রিয়া এবং কোনও সমস্যার সমাধানের সঠিক উপায় নয় যা মূলত ভাষার মূল অংশগুলি কেবল সংকলককে আড়াল করে। <any>মানচিত্রটি এটির সাথে পুনরাবৃত্তি করার জন্য কেবল কাস্টকাস্ট করুন।
কিলভস

1
সাবধানতা: আমি ভেবেছিলাম যে @ কিলভরা উপরের মানচিত্রটিকে "যে কোনও" তে কাস্ট করার পরামর্শ উপরে একটি মার্জিত কাজ ছিল। যখন আমি এটি করেছি, কোডটি সঙ্কলিত এবং অভিযোগ ছাড়াই চলছিল, তবে মানচিত্রটি আসলে পুনরাবৃত্তি হয়নি - লুপের সামগ্রীটি কখনই কার্যকর হয় না। এখানে Array.from()প্রস্তাবিত কৌশলটি আমার পক্ষে কাজ করেছিল।
mactyr

আমি যে খুব চেষ্টা পারেন এটা আমার জন্য কাজ না করে, যা এমনকি stupider বিবেচনা করা হয় হয় ES6 অংশ এবং উচিত "শুধু কাজ" অধিকাংশ ব্রাউজার উপর। তবে আমি অনুমান করি যে আমাদের কৌণিক ওভারলর্ডগুলি জোন.জেজে কিছু ম্যাজিক লম্বা জাম্বো ব্যবহার করে যাতে এটি কাজ না করে, কারণ তারা ES6 ঘৃণা করে। দীর্ঘশ্বাস.
কিলভিস

28

ব্যবহার Array.from , Array.prototype.forEach () , এবং তীর ফাংশন :

পুনরুক্তি কী :

Array.from(myMap.keys()).forEach(key => console.log(key));

পুনরুক্তি মান :

Array.from(myMap.values()).forEach(value => console.log(value));

পুনরুক্তি এন্ট্রি :

Array.from(myMap.entries()).forEach(entry => console.log('Key: ' + entry[0] + ' Value: ' + entry[1]));

2
নিশ্চিত না কেন, আমার কাছে মানচিত্র <স্ট্রিং, কাস্টমক্লাস> এর মতো মানচিত্র রয়েছে। উপরের পদ্ধতিতে আরে.ফ্রম (মাইম্যাপ.ভ্যালিউস ()) ব্যতীত আর কোনও কাজ হয়নি for
রাজশ্রী জিআর

27

এটি আমার পক্ষে কাজ করেছে। টাইপস্ক্রিপ্ট সংস্করণ: 2.8.3

for (const [key, value] of Object.entries(myMap)) { 
    console.log(key, value);
}

7
আমি অবজেক্ট.এন্ট্রি (মাইম্যাপ )টিকে কেবল মাইম্যাপ.এন্ট্রি () এ পরিবর্তন করে কাজ করতে পেরেছি। আমি এই উত্তরটি পছন্দ করি কারণ এটি .for কলগুলির ত্রুটিগুলি পরিচালনা করার ত্রুটিটিকে এড়িয়ে চলে।
এগার্ট করুন

2
আপনার targetমধ্যে যদি এটি থাকে তবে tsconfigএটি es5একটি ত্রুটি ছুড়ে ফেলেছে তবে es6সঠিকভাবে কাজ করে Wor আপনি for (const [key, value] of myMap)লক্ষ্যবস্তু করার সময়ও তা করতে পারেনes6
বেনজমিন ভোগলার

16

প্রতি উপর "নতুন টাইপ করা বিষয় 2.3 রিলিজ নোট --downlevelIteration" :

for..of statements, অ্যারে ডিস্ট্রাকচারিং এবং অ্যারে, কল এবং নতুন এক্সপ্রেশনগুলিতে স্প্রেড উপাদানগুলি ES5 / E3 এ Symbol.iterator সমর্থন করে যদি ব্যবহারের সময় উপলব্ধ থাকে --downlevelIteration

এটি ডিফল্টরূপে সক্ষম নয়! সম্পূর্ণ পুনরায় সমর্থনকারীর সমর্থন পেতে "downlevelIteration": trueআপনার যুক্ত করুন tsconfig.jsonবা এতে --downlevelIterationপতাকা পাস করুন tsc

এটি জায়গায় রেখে আপনি লিখতে পারেন for (let keyval of myMap) {...}এবং keyvalএর ধরণটি স্বয়ংক্রিয়ভাবে অনুমান করা হবে।


কেন এটি ডিফল্টরূপে বন্ধ করা হয়? টাইপস্ক্রিপ্টের অবদানকারী @ অ্যালুয়ানহাদাদ অনুসারে ,

এটি বিকল্প because

আপনি ES2015 (টার্গেট করতে পারেন "target": "es2015"মধ্যে tsconfig.jsonবা tsc --target ES2015) অথবা পরে, সক্রিয় downlevelIterationএকটি কোন- brainer হয়, কিন্তু আপনি যদি ES5 / ES3 লক্ষ্য করে হয়ে গেলে, আপনি বেঞ্চমার্ক পারে তা নিশ্চিত করার জন্য পুনরুক্তিকারীর সমর্থন প্রভাব কর্মক্ষমতা না (যদি এটা আছে, আপনি ভাল হতে পারে Array.fromরূপান্তর বা forEachঅন্য কোনও কাজের সাথে বন্ধ )।


কৌণিক ব্যবহার করার সময় এটি সক্ষম করার জন্য এটি ঠিক আছে বা বিপজ্জনক?
সাইমন_উইভার


8

আমি সর্বশেষ টিএস এবং নোড (যথাক্রমে v2.6 এবং v8.9) ব্যবহার করছি এবং আমি এটি করতে পারি:

let myMap = new Map<string, boolean>();
myMap.set("a", true);
for (let [k, v] of myMap) {
    console.log(k + "=" + v);
}

আপনি কি নিশ্চিত করতে পারেন যে আপনাকে প্রথমে নিজের "downlevelIteration": trueমধ্যে সেট আপ করতে হয়েছিল tsconfig.json?
আহমেদ ফাসিহ

3
আমি downlevelIteratonসেট না , আমার লক্ষ্য es2017তবে।
লিজিবার্ড

আমি মানচিত্রের <স্ট্রিং, কাস্টমক্লাস []> উপাদানটির জন্য এটি করতে পারি না? সংকলক বলে যে এটি টাইপ বা স্ট্রিং ধরণের কোনও অ্যারে নয়।
রাজশ্রী জিআর

এটি আমার পক্ষে ২.৮-তে কাজ করে না - আমি পেয়েছিType 'Map<K, V>' is not an array type or a string type.
সাইমন_উইভার

3

আপনি মানচিত্রের জন্য অ্যারে মানচিত্র পদ্ধতিটি প্রয়োগ করতে পারেন ent

[...myMap.entries()].map(
     ([key, value]: [string, number]) => console.log(key, value)
);

এছাড়াও, অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, আপনাকে আপনার tsconfig.json (সংকলক বিকল্পের অধীনে) নিম্ন স্তরের পুনরাবৃত্তি সক্ষম করতে হবে:

  "downlevelIteration": true,

এই বৈশিষ্ট্যটি টাইপস্ক্রিপ্ট ২.৩ এ প্রবর্তিত হয়েছিল। সমস্যাটি
টাইপস্ক্রিপ্ট ১.৮.১০

আপনি যদি "ডাউনলিভিলিটিশন" ব্যবহার করতে না পারেন তবে আপনি ব্যবহার করতে পারেন:const projected = Array.from(myMap).map(...);
এফ্রিন

1

এটি একটি HTML ডকুমেন্টে এটি ব্যবহার করার জন্য কেবল একটি সহজ ব্যাখ্যা।

আপনার যদি ধরণের মানচিত্র (কী, অ্যারে) থাকে তবে আপনি এইভাবে অ্যারেটি শুরু করুন:

public cityShop: Map<string, Shop[]> = new Map();

এবং এটির পুনরাবৃত্তি করতে, আপনি মূল মানগুলি থেকে একটি অ্যারে তৈরি করুন।

এটিকে যেমন অ্যারে হিসাবে ব্যবহার করুন:

keys = Array.from(this.cityShop.keys());

তারপরে, এইচটিএমএলে, আপনি ব্যবহার করতে পারেন:

*ngFor="let key of keys"

এই লুপটির অভ্যন্তরে, আপনি কেবল এর সাথে অ্যারের মান পাবেন:

this.cityShop.get(key)

সম্পন্ন!



-1

যদি আপনি সত্যিই নেস্টেড ফাংশন পছন্দ করেন না, আপনি কীগুলি দিয়ে পুনরাবৃত্তি করতে পারেন:

myMap : Map<string, boolean>;
for(let key of myMap) {
   if (myMap.hasOwnProperty(key)) {
       console.log(JSON.stringify({key: key, value: myMap[key]}));
   }
}

দ্রষ্টব্য, আপনাকে নন-কী পুনরাবৃত্তিগুলি ফিল্টার hasOwnPropertyকরতে হবে যদি আপনি এটি না করেন তবে আপনি একটি সতর্কতা বা ত্রুটি পাবেন।


এইচটিএমএল এ মানচিত্রের পুনরাবৃত্তি কিভাবে? এটি মোটেই কাজ করছে বলে মনে হয় না। মডেল-মাইম্যাপে <ডিভি এনজি-রিপিট = "(কী, মান)" {{কী}}} </div>
শিনিয়া কইজুমী

@ পাওয়ারফ্যাড 917 এটি কাজ করে না, এটি কেবল অ্যারেগুলির জন্যই কাজ করে কারণ কৌনিকটি আবর্জনার স্তূপ হয়। তবে এটি একটি নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করুন এবং সুতরাং আপনি শিখবেন, যে কৌণিকটি আবর্জনার স্তূপ নয়, তবে আপনাকে এটিকে অ্যারেতে রূপান্তর করতে হবে। দ্রষ্টব্য, এছাড়াও আপনি প্রোগ্রামিংয়ের শীর্ষের শীর্ষস্থানীয় নন, কারণ আপনি কৌণিক এবং টাইপস্ক্রিপ্টের মধ্যে পার্থক্য করতে আপাতদৃষ্টিতে অক্ষম।
পিটারহ - মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.