জাভাস্ক্রিপ্ট - লুপের জন্য myArray.forEach এর প্রতিটি ঘনত্ব


88

আমি প্রচুর প্রশ্ন দেখেছি যা ব্যবহারের পরামর্শ দেয়:

for (var i = 0; i < myArray.length; i++){ /* ... */ }

পরিবর্তে:

for (var i in myArray){ /* ... */ }

বিরতিযুক্ত পুনরাবৃত্তির কারণে অ্যারেগুলির জন্য ( এখানে দেখুন )।


যাইহোক, অবজেক্ট ওরিয়েন্টেড লুপটি পছন্দ করে বলে মনে হচ্ছে এমন কোনও কিছুই আমি খুঁজে পাচ্ছি না:

myArray.forEach(function(item, index){ /* ... */ });

যা আমার কাছে আরও স্বজ্ঞাত মনে হয়।

আমার বর্তমান প্রকল্পের জন্য, আইই 8 এর তুলনামূলক গুরুত্বপূর্ণ এবং আমি মজিলার পলিফিলটি ব্যবহারের বিষয়টি বিবেচনা করছি , তবে এটি কীভাবে কাজ করবে আমি 100% নিশ্চিত নই।

  • লুপের মান (উপরে প্রথম উদাহরণ) এবং আধুনিক ব্রাউজারগুলি দ্বারা অ্যারে.প্রোটোটাইপ.এফ প্রতিটি বাস্তবায়নের মধ্যে কি কোনও পার্থক্য রয়েছে?
  • আধুনিক ব্রাউজার বাস্তবায়ন এবং মজিলার প্রয়োগের উপরের সাথে সংযুক্তি আছে (আইই 8 এর বিশেষ বিষয়ে)?
  • পারফরম্যান্স কোনও ইস্যুর ততটা নয়, কেবলমাত্র ধারাবাহিকতায় যা বৈশিষ্ট্যগুলি পুনরাবৃত্তি হয়।

6
এর breakবাইরে যাওয়া সম্ভব নয় forEach। তবে একটি বড় সুবিধা হ'ল ফাংশনটি দিয়ে একটি নতুন সুযোগ তৈরি করা। পলিফিল দিয়ে আপনার কোনও সমস্যা হওয়া উচিত নয় (কমপক্ষে আমি কোনও সমস্যার মুখোমুখি হইনি)।
hgoebl 12'14

পুরানো IE এর সাথে আপনার যে সমস্যাগুলি হতে পারে তা হ'ল শিম নয়, ভাঙা অ্যারে কনস্ট্রাক্টর / আক্ষরিক আর্ট holesযেখানে undefinedহওয়া উচিত এবং অন্যান্য ভাঙা পদ্ধতি যেমন DOM অবজেক্টের মতো sliceএবং hasOwnPropertyব্র্ট হওয়া উচিত । আমার পরীক্ষা এবং es5 shimএই জাতীয় শিমড পদ্ধতিগুলি স্পেসিফিকেশনের সাথে সামঞ্জস্যপূর্ণ দেখায় (MDN এর শিম পরীক্ষা করা হয়নি)।
Xotic750

4
এবং একটি forলুপ ভেঙে ফেলার জন্য কব্জি, যে কি someজন্য।
Xotic750

4
"যাইহোক, আমি এমন কিছু খুঁজে পাচ্ছি না যা মনে হয় অবজেক্ট অরিয়েন্টেড লুপটিকে পছন্দ করে:" আমি বরং এটিকে কার্যকরীভাবে বনাম বনাম বলব।
মেমকে

Array.find()প্রথম ম্যাচটি খুঁজে পাওয়ার পরে আপনি লুপটি ভেঙে ফেলার জন্য ব্যবহার করতে পারেন ।
মটি

উত্তর:


122

forলুপ এবং forEachপদ্ধতির মধ্যে সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি হ'ল প্রাক্তনের সাথে আপনি breakলুপটি আউট করতে পারেন । আপনি continueকেবলমাত্র ফাংশনটি দিয়ে চলে এসে অনুকরণ করতে পারেন forEachতবে পুরোপুরি লুপিং বন্ধ করার কোনও উপায় নেই।

এটি বাদ দিয়ে দুজন কার্যকরভাবে একই কার্যকারিতা সম্পাদন করে। ভেরিয়েবল উত্তোলনের কারণে আরেকটি ছোট পার্থক্য লুপের জন্য সূচকের (এবং সমস্ত ভেরিয়েবল যুক্ত) এর সুযোগকে জড়িত করে।

// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }

// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });

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


দুটি সংস্করণের মধ্যে আরও কয়েকটি উল্লেখযোগ্য পার্থক্য রয়েছে, বিশেষত কর্মক্ষমতা সম্পর্কিত regarding প্রকৃতপক্ষে, লুপের জন্য সরল forEachপদ্ধতিটির চেয়ে যথেষ্ট ভাল পারফর্ম করে , যেমন এই jspਫ਼ পরীক্ষা দ্বারা প্রদর্শিত ।

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

আপনার যদি forEachএবং / অথবা আপনাকে প্রথমে লুপটি ভেঙে ফেলার প্রয়োজন হয় না, আপনি _.eachবিকল্প হিসাবে লো-ড্যাশ ব্যবহার করতে পারেন যা ক্রস ব্রাউজারেও কাজ করবে। আপনি যদি jQuery ব্যবহার করে থাকেন তবে এটি একটি অনুরূপ সরবরাহ করে $.each, কেবল প্রতিটি পরিবর্তনের কলব্যাক ফাংশনে পাস হওয়া আর্গুমেন্টগুলির পার্থক্যগুলি নোট করুন।

( forEachপলিফিল হিসাবে , যদি আপনি সেই রাস্তাটি যেতে চান তবে এটি সমস্যা ছাড়াই পুরানো ব্রাউজারগুলিতে কাজ করা উচিত))


4
এটি লক্ষণীয় যে লাইব্রেরির সংস্করণগুলি eachইসিএমএ 5 এর নির্দিষ্টকরণের মতো আচরণ করে না forEach, তারা সমস্ত অ্যারেগুলিকে ঘন হিসাবে বিবেচনা করে (আপনি সচেতন হন তবে প্রদত্ত IE বাগগুলি এড়াতে)। অন্যথায় "গোটচা" হতে পারে। একটি রেফারেন্স হিসাবে github.com/es-shims/es5-shim/issues/190
Xotic750

7
এছাড়াও কিছু প্রোটোটাইপ পদ্ধতি রয়েছে যা আপনাকে ভাঙ্গতে দেয় যেমন Array.prototype.someকোনও সত্যবাদী মান ফেরত না দেওয়া বা অ্যারের মাধ্যমে সম্পূর্ণ লুপ না হওয়া অবধি লুপ হবে will Array.prototype.everyঅনুরূপ Array.prototype.someতবে আপনি যদি মিথ্যা মানটি ফিরিয়ে দেন তবে থামে।
axelduch

আপনি যদি বিভিন্ন ব্রাউজার এবং এই জাতীয় শিমগুলির
Xotic750

এছাড়াও, অ্যারে.প্রোটোটাইপ.এফ ব্যবহার করে আপনার কোডটি এক্সটেনশনের করুণায় ফেলেছে। উদাহরণস্বরূপ, আপনি যদি একটি পৃষ্ঠায় এমবেড করার জন্য একটি কোড লিখছেন, এমন সুযোগ রয়েছে যে অ্যারে.প্রোটোটাইপ.এফের সাথে অন্য কোনও কিছুর উপরে ওভাররাইট করা আছে।
মার্বেল ডেমন

4
@ মার্বেলডেমন এর সম্ভাবনা এতটাই ক্ষুদ্র যে এটি কার্যকরভাবে অসম্ভব এবং অতএব তুচ্ছও। Array.prototype.forEachকিছু অ-সামঞ্জস্যপূর্ণ সংস্করণ দিয়ে ওভাররাইটিংয়ের ফলে এতগুলি লাইব্রেরি ভাঙ্গার সম্ভাবনা থাকবে যে কারণে এড়ানো এড়ানো যাই হোক না কেন, কোনও উপকারে আসবে না।
অ্যালেক্সিস কিং

12

আপনি আপনার কাস্টম ফোরচ ফাংশনটি ব্যবহার করতে পারেন যা অ্যারে.এফ.এচের পরে আরও ভাল সঞ্চালন করবে

আপনার কোডটিতে এটি একবার যুক্ত করা উচিত। এটি অ্যারেতে নতুন ফাংশন যুক্ত করবে।

function foreach(fn) {
    var arr = this;
    var len = arr.length;
    for(var i=0; i<len; ++i) {
        fn(arr[i], i);
    }
}

Object.defineProperty(Array.prototype, 'customForEach', {
    enumerable: false,
    value: foreach
});

তারপরে আপনি এটিকে আরে.ফোরএচের মতো যে কোনও জায়গায় ব্যবহার করতে পারেন

[1,2,3].customForEach(function(val, i){

});

পার্থক্যটি এটি 3 গুণ দ্রুত। https://jsppha.com/native-arr-foreach-vs-custom-foreach

আপডেট: নতুন ক্রোম সংস্করণে .forEach () এর কার্যকারিতা উন্নত হয়েছিল। তবে সমাধানটি অন্যান্য ব্রাউজারগুলিতে অতিরিক্ত কর্মক্ষমতা দিতে পারে।

জেএসপিফার্ফ


4

.forEachঅ্যারের একটি পার্শ্ব প্রতিক্রিয়া হবে এবং .mapখাঁটি ফাংশনগুলির জন্য এটি নির্দেশ করতে এটি ব্যবহার করার জন্য এটি অনেক বিকাশকারী (উদাহরণস্বরূপ কাইল সিম্পসন) দ্বারা প্রস্তাবিত । forসংখ্যাগরিষ্ঠ প্রোগ্রামিং ল্যাঙ্গুয়েজে এর বিস্তৃত সমর্থনের কারণে যোগাযোগ করা সহজ বলে লুপগুলির সংখ্যা বা অন্য যে কোনও ক্ষেত্রে কার্যকর হয় না এর জন্য একটি সাধারণ-উদ্দেশ্য সমাধানের সাথে লুপগুলি ফিট করে।

যেমন

/* For Loop known number of iterations */
const numberOfSeasons = 4;
for (let i = 0; i < numberOfSeasons; i++) {
  //Do Something
}

/* Pure transformation */
const arrayToBeUppercased = ['www', 'html', 'js', 'us'];
const acronyms = arrayToBeUppercased.map((el) => el.toUpperCase));

/* Impure, side-effects with .forEach */
const acronymsHolder = [];
['www', 'html', 'js', 'us'].forEach((el) => acronymsHolder.push(el.toUpperCase()));

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

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