یک فروشگاه آنلاین مرتبسازی و فیلتر کردن محصولات خود بر اساس دستهبندیها را به شما سپرده است. شما باید تابعی بنویسید که بتواند لیست محصولات را بر اساس دستهبندیهای انتخابی کاربر و قیمت آنها (به صورت صعودی یا نزولی) فیلتر و مرتبسازی کند.
# پروژه اولیه
پروژه اولیه را از
[این لینک](/problemset/assignments/4367/download_problem_initial_project/251306/)
دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
```
initial-project.zip
├── src
│ └── <mark class="violet">index.js</mark>
```
برای اجرای پروژه میتوانید از Node.js استفاده کنید. برای این کار با استفاده از ترمینال، به پوشه پروژه بروید و دستور زیر را وارد کنید:
```
node src/index.js
```
# جزئیات
وظیفه شما این است که تابع `filterAndSortProducts` را کامل کنید. ورودیهای این تابع لیستی از محصولات (`products`) و معیارهای مرتبسازی (`criteria`) خواهد بود:
<details class="blue">
<summary>
**محصولات**
</summary>
| محصول |
|:------------------:|
| `id`، `name`، `category` و `price` |
لیستی از محصولات به عنوان ورودی اول به تابع داده میشود. به عنوان مثال:
```js
const products = [
{ id: 1, name: "Apple iPhone 12", category: "Electronics", price: 999 },
{ id: 2, name: "Adidas running shoes", category: "Sportswear", price: 280 },
{ id: 3, name: "Samsung Galaxy S21", category: "Electronics", price: 850 },
{ id: 4, name: "Nike Air Max", category: "Sportswear", price: 300 }
];
```
</details>
<details class="violet">
<summary>
**معیارها**
</summary>
کاربران میتوانند محصولات را بر اساس دستهبندی، قیمت، طول نام محصول و یا کلمات کلیدی فیلتر و همچنین آنها را به صورت صعودی یا نزولی مرتب کنند.
| معیار | تعریف |
|:------------------:|:------------------:|
| `categories` | لیستی از نام دستهبندیهای مورد نیاز برای فیلتر محصولات |
| `priceRange` | تعیین بازه قیمت برای فیلتر محصولات |
| `nameLength` | تعیین بازه طول کلمه برای فیلتر نام محصولات |
| `keywords` | کلمات کلیدی برای فیلتر محصولات |
| `sortBy` | لیستی از معیارهای مرتبسازی و نحوه مرتبسازی |
آبجکت معیارها به عنوان ورودی دوم به تابع داده میشود. به عنوان مثال:
```js
const criteria = {
categories: ["Electronics", "Sportswear"],
priceRange: { min: 200, max: 1000 },
nameLength: { min: 10, max: 25 },
keywords: ["Galaxy", "Air"],
sortBy: [
{ field: "price", order: "ascending" },
{ field: "name", order: "descending" }
]
};
```
<details open class="violet">
<summary>
**نکته**
</summary>
ممکن است هر یک از مقادیر `criteria` اصلا وجود نداشته باشد یا مقدار خالی داشته باشد. در صورتی که هر کدام از معیارها داده نشد، فیلتر یا مرتبسازی برای آن معیار انجام نخواهد شد.
</details>
</details>
با توجه به مثالها، خروجی تابع باید به شکل زیر باشد:
```js
[
{ id: 4, name: "Nike Air Max", category: "Sportswear", price: 300 },
{ id: 3, name: "Samsung Galaxy S21", category: "Electronics", price: 850 }
]
```
# نحوهی ارسال پاسخ
پس از اعمال تغییرات در `index.js`، آن را داخل فولدر `src` قرار داده و به صورت یک فایل *ZIP* با ساختار زیر ارسال نمایید.
```
[your-zip-file-name].zip
├── src
│ └── <mark class="violet">index.js</mark>
```
<details class="yellow">
<summary>
**توجه**
</summary>
فراموش نکنید هنگام ارسال، امضای تابع به صورت زیر باشد:
```js src/index.js
function filterAndSortProducts(products, criteria) {
}
module.exports = { filterAndSortProducts };
```
</details>