javascriptincludes, indexOf and findIndexجستوجوی مقدار و اندیس آرایه در جاوااسکریپت
جستوجوی آرایه در جاوااسکریپت با includes، indexOf و findIndex؛ پاسخ بولی، اندیس صفر، نتیجهٔ منفی یک و تفاوت بررسی NaN را با کد مقایسه کنید.
مفهوم به زبان ساده
پیش از جستوجو تعیین کنید چه نتیجهای لازم دارید. includes برای وجود یک مقدار، true یا false میدهد. indexOf نخستین اندیس همان مقدار را پیدا میکند و اگر نباشد، منفی یک میدهد. findIndex بهجای مقدار آماده، تابع آزمون میگیرد؛ بنابراین برای یافتن ردیف بر اساس ویژگیای مانند شناسه مناسب است. اگر خود ردیف را لازم دارید، مدخل find را هم بخوانید.
در مثال، شناسهٔ p1 در اندیس صفر است. این نتیجه موفق است، ولی اگر آن را مستقیماً در شرط بگذاریم، صفر falsy خواهد بود. پس وجود تطبیقِ indexOf یا findIndex را با !== -1 بررسی میکنیم. بخش دوم تفاوت عدد NaN را نشان میدهد: includes آن را پیدا میکند، ولی indexOf برای آن منفی یک میدهد، چون قواعد مقایسهٔ این دو دقیقاً یکسان نیست.
برای شیءها، جستوجوی مستقیم مقدار معمولاً به هویت مرجع وابسته است؛ ساختن یک شیء تازه با همان فیلدها آن را همان عضو نمیکند. در چنین وضعی، شناسهٔ معتبر را با findIndex مقایسه کنید. برای تمرین، عضو نخست، عضو آخر و یک شناسهٔ ناموجود را آزمایش کنید و نوع خروجی هر روش را قبل از اجرا بنویسید.
کجا به کار میآید؟
- بررسی وجود یک شناسه در فهرست انتخابها
- پیداکردن جای ردیف برای جایگزینی آگاهانه بر اساس شناسه
از تعریف تا یک مثال واقعی
const ids = ['p1', 'p2'];
console.log(ids.includes('p1'));
console.log(ids.indexOf('p1'));
console.log(ids.indexOf('p9'));
console.log([NaN].includes(NaN));
console.log([NaN].indexOf(NaN));
const rows = [{ id: 'p1' }, { id: 'p2' }];
console.log(rows.findIndex((row) => row.id === 'p2'));
true 0 -1 true -1 1
این مثال چطور کار میکند؟
includes فقط وجود p1 را گزارش میکند.
indexOf جای p1 را صفر و جای شناسهٔ ناموجود را منفی یک میدهد.
includes میتواند NaN را پیدا کند، ولی indexOf آن را برابر تشخیص نمیدهد.
findIndex با آزمون شناسه، اندیس ردیف دوم را برمیگرداند.
اشتباه رایج
if (ids.indexOf(value)) بررسی درستی برای وجود مقدار نیست. صفر یعنی تطبیق نخست و منفی یک یعنی نبود تطبیق؛ شرط صریح بنویسید.
این را به خاطر بسپارید
خروجی بولی، اندیس و خود عضو را با هم مخلوط نکنید؛ ابزار را بر اساس نتیجهٔ مورد نیاز انتخاب کنید.