برنامه نویسی

چرا باید از روش کاهش در جاوا اسکریپت استفاده کنم؟

همچنین در وبلاگ من موجود است

من از روش کاهش استفاده نمی کنم و با آن خوب هستم

احتمالاً شما قبلاً یک توسعه دهنده جاوا اسکریپت با تجربه هستید اما از آن استفاده نکرده اید .reduce() روش در شما
کد تولید هنوز. شما هنوز نمی توانید مورد استفاده مناسب برای این روش پیدا کنید.

چه کاری انجام می دهد و چرا می خواهم از آن استفاده کنم؟ – ممکن است بپرسید

در این مقاله نمونه کدهای زیادی را به شما نشان خواهم داد که در آن .reduce() یک انتخاب عالی است

مبانی

زمانی که نیاز به تکرار روی یک آرایه دارید، می توانید از آن استفاده کنید for، forEach یا for..of. زمانی که نیاز به تکرار و بازگشت دارید
داده (بیشتر اوقات – اصلاح شده) داده برای هر عنصری که احتمالاً استفاده می کنید map.

reduce در مقایسه با روش های ذکر شده در بالا کمی متفاوت است. برای محاسبه یک مقدار بر اساس استفاده می شود
روی آرایه

در اینجا یک مثال کوچک وجود دارد که تفاوت های اصلی را نشان می دهد:

map([🌽, 🐮, 🐔], cook) => [🍿, 🍔, 🍳]

filter([🍿, 🍔, 🍳], isVegetarian) =>  [🍿, 🍳]

reduce([🍿, 🍳], eat) => 💩
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

امیدوارم از قبل اصول اولیه را دریافت کرده باشید، درست است؟

مورد استفاده اساسی

بهترین مثالی که مفروضات ما را برای محاسبه یک مقدار بر اساس آرایه برآورده می کند، بدست آوردن مجموع مقداری سفارش است.
در زیر می توانید مجموعه ای از محصولات را به همراه قیمت آن مشاهده کنید. ساده ترین راه برای محاسبه کل سفارش، استفاده از آن است
for..of:

const order = [
    { product: '👘', price: 21 },
    { product: '👜', price: 37 },
    { product: '🦺', price: 69 },
];

let total = 0; // 127

for (const item of order) {
    total += item.price
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

reduce همین مشکل را در یک لاینر راحت حل می کند:

const total = order.reduce((total, item) => total + item.price, 0) // 127
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال های اضافی فراوان

در این بخش نمونه های بسیار دیگری از استفاده را به شما نشان خواهم داد reduce. لطفاً به خاطر داشته باشید که بسیاری از اینها می توانند، و
باید با استفاده از روش های آرایه مناسب تر و کارآمدتر بازنویسی شود.

بیایید با لیست مواد تشکیل دهنده یک تخم مرغ همزده شروع کنیم 🍳:

const ingredients = [
    {id: 1, name: "egg 🥚", calories: 140, diet: "vegetarian"},
    {id: 2, name: "egg 🥚", calories: 140, diet: "vegetarian"},
    {id: 3, name: "butter 🧈", calories: 90, diet: "vegetarian"},
    {id: 4, name: "bacon 🥓", calories: 210, diet: "carnivore"}
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مواد را بشمار

result = ingredients.reduce((acc, item) => acc + 1, 0); // 4

// alternative way
result = ingredient.lenght; // 4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مجموع کالری تمام مواد تشکیل دهنده

result = ingredients.reduce((acc, item) => acc += item.calories, 0) // 580

// alternative way
// .reduce is problably the best solution in this case
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نام مجموعه ای از مواد تشکیل دهنده

result = ingredients.reduce((acc, item) => [...acc, item.name], []) // [ 'eggs', 'butter', 'bacon' ]

// alternative way
result = ingredients.map(item => item.name); // [ 'eggs', 'butter', 'bacon' ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تعداد رخدادها

result = ingredients.reduces((acc, item) => {
    return {...acc, [person.age]: (acc[person.age] ||0) + 1} // { 'egg 🥚': 2, 'butter 🧈': 1, 'bacon 🥓': 1 }
}, {})

// alternative way
// using lodash
_.countBy(ingredients, "name");
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گروه بر اساس نوع رژیم غذایی

result = ingredients.reduce((grouped, item) => {
    const {diet, name} = item;
    if(grouped[diet] == null) grouped[diet] = [];
    grouped[diet].push(name)
    return grouped
}, {}) // {vegetarian: [ 'egg 🥚', 'egg 🥚', 'butter 🧈' ], carnivore: [ 'bacon 🥓' ]}

// alternative way (need to be transformed to return just names)
_.groupBy(ingredients, "diet"); 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جستجوی مواد تشکیل دهنده بر اساس شناسه

result = ingredients.reduce((acc, item) => {
  return {...acc, [item.id]: item}
}, {})

/* 
{
    '1': {
        id: 1,
        name: 'egg 🥚',
        calories: 140,
        diet: 'vegetarian'
},
    '2': {
        id: 2,
        name: 'egg 🥚',
        ... 
*/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وقتی می‌خواهیم به یک عنصر خاص دسترسی پیدا کنیم، ایجاد چنین شیئی به ما یک مزیت کارایی می‌دهد – لازم نیست
تکرار روی یک آرایه کامل به دنبال عنصر منطبق است.

موادی را با بیشترین کالری دریافت کنید

result = ingredients.reduce((acc, item) => {
  if (acc === null || item.calories > acc) return item.calories
  return acc
}, null) // 210

// alternative way
result = Math.max(...ingredients.map(item => item.calories)) // 210
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

پس از خواندن و درک همه این مثال ها مطمئن هستم که می دانید در چه مواردی reduce بهترین راه حل خواهد بود

استفاده كردن reduce به نظر می رسد یک راه عالی برای حل برخی از مشکلات در جاوا اسکریپت باشد، اما در عین حال مخالف نیز وجود دارد
دیدگاه در میان بسیاری از توسعه دهندگان جیک آرچیبالد (@jaffathecake) در این مورد توییتی منتشر کرد:

تمام کدهایی که از array.reduce استفاده می کنند باید بدون array.reduce بازنویسی شوند تا برای انسان قابل خواندن باشد. موضوع را قطع می کند

اکنون این تنها مسئولیت شماست که تصمیم بگیرید که آیا می خواهید ترکیب کنید reduce روشی برای زندگی روزمره یا
شاید بخواهید به دیدگاه جیک پایبند باشید و از روش‌های آرایه‌ای دیگر همراه با لودش معروف استفاده کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا