بازگشت به درس

عضوهای یکتای آرایه را جدا کنید

اهمیت: 4

فرض کنیم که arr یک آرایه است.

تابع unique(arr) را بنویسید که آرایه‌ای شامل المان‌های یکتای arr را برمی‌گرداند.

برای مثال:

function unique(arr) {
  /* کد شما */
}

let strings = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(strings) ); // Hare, Krishna, :-O

باز کردن یک sandbox همراه با تست‌ها.

بیایید المان‌های آرایه را بررسی کنیم:

  • برای هر المان بررسی می‌کنیم که آیا آرایه حاصل دارای آن المان هست یا نه.
  • اگر بود، المان را نادیده می‌گیریم، در غیر این صورت آن را به نتایج اضافه می‌کنیم.
function unique(arr) {
  let result = [];

  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }

  return result;
}

let strings = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(strings) ); // Hare, Krishna, :-O

این کد کار می‌کند، اما احتمالا یک اشکال عملکردی دارد.

متد result.includes(str) درون آرایه result را بررسی می‌کند و هر المان را با str مقایسه می‌کند تا المان مورد نظر را پیدا کند.

ینابراین اگر 100 المان درون result وجود داشته باشد و هیچ کدام با str برابر نباشد، سپس تمام result را بررسی می‌کند و دقیقا 100 مقایسه انجام می‌دهد. و اگر result بزرگ باشد، مثلا 10000، سپس به تعداد 10000 مقایسه وجود خواهد داشت.

این به خودی خود مشکل محسوب نمی‌شود، چون موتورهای جاوااسکریپت بسیار سریع هستند، پس بررسی یک آرایه با 10000 المان چند میکروثانیه طول می‌کشد.

اما ما در حلقه for چنین آزمایشی را برای هر المان درون arr انجام می‌دهیم.

پس اگر arr.length برابر با 10000 باشد ما چیزی مثل 10000*10000 = 100 میلیون مقایسه خواهیم داشت. این مقدار بسیار زیاد است.

بنابراین این راه حل تنها برای آرایه‌های کوچک مناسب است.

بعدا در فصل ساختارهای Map و Set ما یاد می‌گیریم که چگونه آن را بهینه کنیم.

function unique(arr) {
  let result = [];

  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }

  return result;
}

باز کردن راه‌حل همراه با تست‌ها درون یک sandbox.