یعنی عملکردی وجود دارد که به شما امکان می دهد با عبور از مرزهای بالا و پایین ، طیف وسیعی از اعداد یا شخصیت ها را بدست آورید.
آیا برای این کار هیچ چیز ساخته شده در JavaScript وجود دارد؟اگر نه ، چگونه می توانم آن را پیاده سازی کنم؟
No, but you can define the function using: const range = (start, stop, step) =>array. from (< length: (stop - start) / step + 1>, (_, i) =>شروع + (i * مرحله)) ؛(به "دنباله ژنراتور (دامنه)" از MSDN مراجعه کنید) توجه: این عملکرد فقط در صورتی کار می کند که تمام پارامترها مشخص شوند (یعنی دامنه (1،5،1) آرایه را تولید می کند [1،2،3،4،5] ، امادامنه (1،5) یک آرایه خالی تولید می کند)
86 پاسخ 86
شماره
تکرار شخصیت
تکرار
به عنوان توابع
به عنوان توابع تایپ شده
مرورگرهای قدیمی Non ES6 بدون کتابخانه:
(اعتبار ES6 به نیلز پیترسون و سایر مفسران)
زیرا اگر در هر جایی مفید باشد ، احتمالاً در JS مفید است.(JS می تواند مواردی از نوع برنامه نویسی کاربردی را انجام دهد ، که می تواند از یک دامنه بهره مند شود (0 بیانیه. این و هزار دلیل دیگر ممکن است در برخی از موارد Semirare مفید باشد)
هر ایده ای که چرا به سادگی استفاده می شود (آرایه جدید (5)). نقشه (عملکرد (مقدار ، فهرست)< retu index; >) آیا کار نمی کند؟این [5 × تعریف نشده] برای من در Devtools Chrome باز می گردد.
lewis زیرا آرایه ای با آن تعریف شده است که دارای شکاف های خالی است که با نقشه () یا یکی از دوستانش تکرار نمی شود.
برای اعداد می توانید از array. from () استفاده کنید ، که این روزها در همه چیز کار می کند به جز IE:
که آرایه ای از 0 تا 19 فراگیر ایجاد می کند. این می تواند بیشتر به یکی از این اشکال کوتاه شود:
به عنوان مثال می توان مرزهای پایین و بالا را نیز مشخص کرد:
Slightly more succinct than the Array.from() method, and faster than both: Array(20).fill().map((_, i) =>من)
delapouite عالی! شما باید آن را یک پاسخ جداگانه بیان کنید ، و من به آن رأی می دهم! این همچنین پاسخ کاملی برای این تکراری است.
@ICC97 بله ، خطوط ممکن است شکایت کند ، اگرچه در JavaScript یک آرگومان عملکردی را که تعریف شده است همانند تصویب نامشخص است ، حذف می کند ، بنابراین پر کردن () (بدون استدلال) به خودی خود اشتباه نیست. مقدار پر در آن راه حل استفاده نمی شود ، بنابراین اگر دوست دارید می توانید از پر (0) برای ذخیره چند کاراکتر استفاده کنید.
فرم مورد علاقه من (ES2015)
و اگر به یک عملکرد با یک مرحله پارامتر نیاز دارید:
یکی دیگر از اجراهای احتمالی که توسط اسناد MDN پیشنهاد شده است:
RODFERSOU FYI: مثال شما اشتباه است. توقف در واقع موقعیت توقف / پایان نیست بلکه تعداد / فاصله است.(بدون جرم ، فقط برای آگاهی از افراد از تایپی)
استدلالی که شما به آرایه منتقل می کنید (Math. ceil ((توقف - شروع) / مرحله) + 1) ، در پایان به 1+ نیاز دارد تا واقعاً از رفتار "فراگیر" PHP تقلید کند.
این پاسخ برتر است که در واقع به سؤال کامل یک عملکرد JavaScript پاسخ می دهد که یک روش دامنه را به طور کامل پیاده سازی می کند. همه بقیه در حال حاضر بالاتر از این (به جز Lodash's _. range) تکرارهای اساسی را به جای یک عملکرد محدوده واقعی با شروع ، توقف و مرحله اجرا می کنند
این 2 سنت من است:
این در واقع اشتباه است زیرا سؤال از ارزش های شروع و پایان است. شروع و شمارش/فاصله.
این برای شخصیت ها و اعداد کار می کند ، با یک مرحله اختیاری به جلو یا عقب می رود.
اگر افزودن انواع بومی چیز شماست ، آن را به array. range اختصاص دهید.
عملکرد محدوده ساده:
برای ترکیب نوع داده BigInt ، برخی از چک ها می توانند گنجانده شوند ، اطمینان حاصل می شود که همه متغیرها یک نوع شروع هستند:
برای حذف مقادیر بالاتر از تعریف توسط توقف به عنوان مثالدامنه (0،5،2) شامل 6 خواهد بود که نباید باشد.
این کار هنگام مرحله کار نمی کند! = 1 ، شرایط باید در نظر گرفته شود. نسخه به روز شده من با یک مقدار مرحله پیش فرض: دامنه عملکرد (شروع ، توقف ، مرحله)< step = step || 1 var a=[start], b=start; while((b+step) < stop)< console.log("b: " + b + ". a: " + a + "."); b+=step; a.push(b); >retu a; >
من باید فقط با نگاه کردن به آن بگویم ، اگر میلیون رکورد را امتحان کنید ، رایانه شما را خراب می کند. اگر اینطور نیست ، فقط با یک صفر دیگر امتحان کنید. من فکر نمی کنم شما می توانید با بیش از 8 صفر از یک عدد فراتر بروید.
خوب ، در JavaScript ما عملکردی مانند PHP نداریم ، بنابراین باید عملکردی را ایجاد کنیم که بسیار آسان باشد ، من یک کارکرد یک خط را برای شما می نویسم و آنها را برای اعداد و الفبای زیر جدا می کنم:
برای اعداد:
و آن را مانند:
برای حروف الفبا:
و آن را مانند:
من فکر می کنم در این توابع خطاهای خارج از کشور وجود دارد. باید آرایه باشد (پایان - شروع + 1) و آرایه (end. charcodeat (0) - start. charcodeat (0) + 1).
این روش فقط با اعداد صحیح و شخصیت ها کار می کند. اگر پارامترها تهی ، نامشخص ، نان ، بولی ، آرایه ، شی و غیره باشند ، این روش خطای زیر را برمی گرداند: روش تعریف نشده touppercase به و غیره!
همانطور که Miike3459 نوشت ، اگر یک روز آرایه. range به Lib استاندارد اضافه می شود ، ممکن است یک مشکل جدی داشته باشید.
با دلتا/مرحله
نمونه ها و گزینه های دیگر
عملکرد دامنه به عنوان تکرارها فقط به عنوان ژنراتور
از مراحل/دلتا
برای متن
لیست کاراکترها را با تک لاینر ایجاد کنید
عملکرد مفید برای انجام ترفند ، قطعه کد را در زیر اجرا کنید
در اینجا نحوه استفاده از آن آورده شده است
دامنه (شروع ، پایان ، مرحله = 1 ، افست = 0) ؛
- شامل - محدوده رو به جلو (5،10) // [5 ، 6 ، 7 ، 8 ، 9 ، 10]
- شامل دامنه عقب مانده (10،5) // [10 ، 9 ، 8 ، 7 ، 6 ، 5]
- مرحله - دامنه عقب (10،2،2) // [10 ، 8 ، 6 ، 4 ، 2]
- منحصر به فرد - محدوده رو به جلو (5،10،0 ، -1) // [6 ، 7 ، 8 ، 9] خودشان 5،10 نیستند
- افست - محدوده گسترش (5،10،0،1) // [4 ، 5 ، 6 ، 7 ، 8 ، 9 ، 10 ، 11]
- افست - محدوده کوچک شدن (5،10،0 ، -2) // [7 ، 8]
- مرحله - گسترش دامنه (10،0،2،2) // [12 ، 10 ، 8 ، 6 ، 4 ، 2 ، 0 ، -2]
امیدواریم برای شما مفید واقع شود.
و در اینجا نحوه عملکرد آن آورده شده است.
اساساً من ابتدا طول آرایه حاصل را محاسبه می کنم و یک آرایه پر از صفر را برای آن طول ایجاد می کنم ، سپس آن را با مقادیر مورد نیاز پر می کنم
- (step || 1) =>و دیگران مانند این بدان معنی است که از مقدار مرحله استفاده می کنند و در صورت عدم ارائه به جای آن از 1 استفاده کنید
- ما با محاسبه طول آرایه نتیجه با استفاده از (math. abs (پایان - شروع) + ((افست || 0) * 2)) / (مرحله || 1) + 1) شروع می کنیم تا ساده تر شود (اختلاف * جبراندر هر دو جهت/مرحله)
- پس از رسیدن به طول ، سپس یک آرایه خالی با مقادیر اولیه با استفاده از آرایه جدید (طول) ایجاد می کنیم . fill (0) ؛اینجا را بررسی کنید
- اکنون ما یک آرایه داریم [0،0،0.] به طول ما می خواهیم. ما بر روی آن نقشه می کشیم و با استفاده از array. map (عملکرد () یک آرایه جدید را با مقادیر مورد نیاز خود باز می گردانیم<>)
- Direction var = شروع< end ? 1 : 0; Obviously if start is not smaller than the end we need to move backward. I mean going from 0 to 5 or vice versa
- در هر تکرار ، شاخص StartPoint + Stepize * مقدار مورد نیاز ما را به ما می دهد
مفید ، مطمئناً. ساده؟من با شما موافق نیستم؛صرف نظر از اینکه شما آن را به یک آستر تبدیل می کنید. آمدن از پایتون این یک شوک است.
pascalvkooten ، بله ، مطمئناً اگر روش داخلی برای آن مانند پایتون وجود داشته باشد ، بسیار عالی خواهد بود ، اما این ساده ترین روشی بود که می توانستم به آن بیایم. و ثابت شده است که در پروژه های من مفید است.
ارسال یک قطعه کد دردناک پیچیده مانند آن ، به خصوص به عنوان یک لاینر و بدون هیچ توضیحی در مورد نحوه عملکرد آن؟نمونه ای ضعیف از یک پاسخ خوب ، صرف نظر از اینکه آیا این کار را انجام می دهد یا خیر.
madbreaks ، بله حق با شماست. من ساده لوح بوده ام تا آن را به یک آستر تبدیل کنم. فقط می خواستم یک راه حل سریع و آسان به همه ارائه دهم
--- به روز رسانی (با تشکر از lokhmakov برای ساده سازی) ---
نسخه دیگری با استفاده از ژنراتورهای ES6 (به پاسخ Great Paolo Moretti با ژنراتورهای ES6 مراجعه کنید):
یا اگر فقط به تکرار نیاز داریم ، پس:
--- کد orginal این بود: ---
این باید پاسخ را با اولویت در مورد راه حل قابل تکرار در نظر گرفته شود. به خصوص برای دامنه های بزرگ ، این رویکرد سریعتر است و باعث صرفه جویی در فضا می شود.
با استفاده از عملکردهای اپراتور و پیکان هارمونی:
اگر در کد ویژوال استودیو ، با خطا روبرو شدید:

نوع "Imbleiterator" یک نوع آرایه یا نوع رشته نیست. از گزینه کامپایلر '-DownLeveliteration' استفاده کنید تا تکرار تکرارها شود.
شما می توانید به
می توانید از Lodash یا Undescore. js استفاده کنید:
از طرف دیگر ، اگر فقط به طیف متوالی عدد صحیح نیاز دارید می توانید کاری مانند:
در محدوده ES6 با ژنراتورها قابل اجرا است:
این اجرای در هنگام تکرار توالی های بزرگ ، حافظه را ذخیره می کند ، زیرا لازم نیست تمام مقادیر را در یک آرایه تحقق بخشد:
قسمت ES6 اکنون پاسخ صحیحی برای این سوال است. من توصیه می کنم قسمت های دیگر را که تحت پوشش سایر پاسخ ها قرار دارند ، حذف کنید.
ژنراتورها اگر در خارج از یک حلقه مورد استفاده قرار بگیرند تا حدودی عجیب هستند: x = دامنه (1 ، 10) ؛ //<>ایکس؛//<>// شبیه نقشه خالی WTF است. x. next (). مقدار ؛ // ok 1 ؛ x [3] // تعریف نشده ، فقط با آرایه واقعی
برخی از تحقیقات در مورد برخی از کارکردهای مختلف را انجام داد. مقایسه JSPERF از روشهای مختلف برای انجام این کارکردها. مطمئناً یک لیست کامل یا جامع نیست ، اما باید به شما کمک کند :)
برنده است.
از نظر فنی سریعترین آن در Firefox نیست ، اما تفاوت سرعت دیوانه (IMHO) در Chrome باعث می شود آن را جبران کند.
همچنین مشاهده جالب این است که کروم با این عملکردهای آرایه نسبت به Firefox چقدر سریعتر است. کروم حداقل 4 یا 5 برابر سریعتر است.
دامنه (شروع ، پایان ، مرحله): با تکرار ES6
شما فقط از مرزهای بالا و پایین درخواست می کنید. در اینجا ما یکی را با یک قدم نیز ایجاد می کنیم.
به راحتی می توانید عملکرد ژنراتور دامنه () را ایجاد کنید که می تواند به عنوان یک تکرار کننده عمل کند. این بدان معنی است که شما مجبور نیستید کل آرایه را از قبل تولید کنید.
حال ممکن است بخواهید چیزی را ایجاد کنید که آرایه را از طریق تکرار کننده از قبل ایجاد کند و لیستی را برگرداند. این برای کارکردهایی که یک آرایه را می پذیرند مفید است. برای این کار می توانیم از array. from () استفاده کنیم
اکنون می توانید یک آرایه استاتیک به راحتی تولید کنید ،
اما هنگامی که چیزی خواسته است یک تکرار کننده (یا به شما امکان استفاده از یک تکرار کننده را می دهد) می توانید به راحتی یکی را نیز ایجاد کنید.
کتاب آموزش بورس...
ما را در سایت کتاب آموزش بورس دنبال می کنید
برچسب :
نویسنده : ژیلا توفیقی
بازدید : <-PostHit->
تاريخ : چهارشنبه
2 فروردين
1402 ساعت: 12:13