javascriptArray.prototype.find()متد find در جاوااسکریپت
find در جاوااسکریپت نخستین عضو مطابق شرط را برمیگرداند. جستوجوی کالا با شناسه، مدیریت undefined و تفاوت نتیجهٔ find با filter را با مثال بخوانید.
مفهوم به زبان ساده
برای نمایش مشخصات یک کالا، معمولاً فقط یک عضو از فهرست را با شناسهاش میخواهیم. find تابع آزمون را بهترتیب روی اعضا اجرا میکند و نخستین عضوی را که پذیرفته شود، برمیگرداند. پس از پیدا شدن آن عضو، جستوجو ادامه پیدا نمیکند. برخلاف #array-filter، نتیجهٔ find آرایهای از همهٔ تطبیقها نیست؛ خود یک عضو یا undefined است.
در مثال، محصولی با شناسهٔ p2 را پیدا میکنیم. چون محصول وجود دارد، نام آن چاپ میشود. برای شناسهٔ p9 نتیجه undefined است و پیش از خواندن ویژگی name، این حالت را صریحاً بررسی میکنیم. این بررسی در رابط واقعی هم لازم است؛ دادهٔ قدیمی، حذف کالا یا نشانی اشتباه نباید به خواندن ویژگی از undefined و شکست صفحه منجر شود.
اگر چند عضو شرط را داشته باشند، فقط اولین آنها برمیگردد؛ بنابراین find راه بررسی یکتایی شناسه نیست. همچنین شیء پیداشده کپی مستقل نیست و به همان شیء موجود در آرایه اشاره میکند. در آرایهای که خود undefined را بهعنوان عضو مجاز دارد، نتیجهٔ undefined بهتنهایی اثبات نمیکند عضوی پیدا نشده است. برای چنین قراردادهایی، بررسی اندیس با findIndex یا آزمون وجود با some میتواند گویاتر باشد. در نمونهٔ کالاها، اعضا شیء هستند و این ابهام را نداریم.
کجا به کار میآید؟
- پیداکردن یک کالا، درس یا کاربر در فهرست با شناسه
- دریافت نخستین موردی که شرط مشخصی را دارد
از تعریف تا یک مثال واقعی
const products = [
{ id: 'p1', name: 'دفتر' },
{ id: 'p2', name: 'کتاب' }
];
const selected = products.find((product) => product.id === 'p2');
if (selected !== undefined) console.log(selected.name);
const missing = products.find((product) => product.id === 'p9');
console.log(missing === undefined);
کتاب true
این مثال چطور کار میکند؟
products دو شیء دارای شناسه و نام را نگه میدارد.
find شرط برابری شناسه با p2 را بررسی میکند و همان شیء دوم را میدهد.
پیش از خواندن name، موجودبودن نتیجه بررسی میشود.
برای p9 تطبیقی وجود ندارد؛ مقایسهٔ نتیجه با undefined برابر true است.
اشتباه رایج
بلافاصله پس از find ویژگی عضو را نخوانید، مگر موجودبودنش تضمین شده باشد. نتیجه ممکن است undefined باشد. همچنین تغییر selected.name در این نمونه، همان شیء داخل products را تغییر میدهد.
این را به خاطر بسپارید
find یک عضو میدهد، filter آرایه میدهد؛ حالت پیدا نشدن را پیش از استفاده از ویژگیهای نتیجه بررسی کنید.