جاوااسکریپت - تایپاسکریپت آرایه map در مقابل filter در مقابل؟
در اینجا یک متد تایپاسکریپت وجود دارد که میخواهد یک آرایه از رشتهها را طی کند و آرایه دیگری از رشتهها برگرداند، جایی که رشتههایی که با عبارت منظم مطابقت دارند (که چیزی شبیه به "[la la la]" فرمت شدهاند) فقط به "la la la" تبدیل میشوند و رشتههایی که مطابقت ندارند حذف میشوند. بنابراین اگر آرایه ورودی من این باشد:
"[x]", "x", "[y]"
میشود
"x", "y"
کد من این است:
questions(): string[] {
var regexp = /\[(.*)\]/;
return this.rawRecords[0].map((value) => {
console.log(value);
var match = regexp.exec(value);
if (match) {
return match[1];
}
});
}
من در نهایت با خروجی مانند این مواجه میشوم:
"x", undefined, "y"
به خاطر «if (match)». راه درست نوشتن این کد در تایپاسکریپت/جاوااسکریپت چیست؟
پاسخ شماره ۱
فقط آنها را فیلتر کنید:
return this.rawRecords[0].map((value) => {
console.log(value);
var match = regexp.exec(value);
if (match) {
return match[1];
}
});
}).filter(x=>!!x);
پاسخ شماره ۲
کاری که map انجام میدهد این است که تابع شما را به هر عنصر در لیست شما اعمال کند. تابع شما هیچ مقداری برنمیگرداند وقتی regex مطابقت ندارد. بنابراین، احتمالاً JS باعث میشود در این موارد undefined برگردانده شود. اگر میخواهید عناصر که با regexp مطابقت ندارند را حذف کنید، باید فوراً از filter استفاده کنید.
به نامهای توابع فکر کنید و بلافاصله درک بهتری خواهید داشت (map یک تابع را به یک لیست اختصاص میدهد و filter یک لیست را فیلتر میکند).
