---
title: "بتقسم مصفوفة لمجموعات بـ reduce؟ استعمل Object.groupBy"
description: "Object.groupBy بيقسم أي مصفوفة لمجموعات بسطر واحد حسب قيمة بترجّعها دالة، وبيرجّع object بلا prototype. ولما المفتاح object مش نص، استعمل Map.groupBy."
url: https://ihsanalapsi.dev/articles/javascript-object-groupby
lang: ar
date: 2026-11-06
updated: 2026-11-06
tags: ["تطوير الويب", "أدوات المطورين"]
author: Ihsan Alapsi (إحسان العبسي)
---
# بتقسم مصفوفة لمجموعات بـ reduce؟ استعمل Object.groupBy

كود reduce بكذا سطر لتقسم الطلبات حسب حالتها، أو مكتبة كاملة محمّلة عشان دالة وحدة اسمها groupBy. كتير مشاريع لسا فيها الاتنين، مع إنو الـ JavaScript نفسها صار فيها الدالة. بهالمقال رح تبدّل هالكود بسطر، وتعرف الفخ الصغير يلي بالنتيجة، وإمتى بتحتاج الأخت التانية.

## شو هو Object.groupBy؟

الـ Object.groupBy دالة جاهزة بالـ JavaScript بتاخد مصفوفة ودالة، وبتحط كل عنصر بمجموعة اسمها القيمة يلي رجّعتها الدالة إله.

حسب [صفحة Object.groupBy على MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy)، الدالة بتقبل أي شي بيتكرّر عليه متل المصفوفة، وبترجّع object فيه خاصية لكل مجموعة، وكل خاصية مصفوفة بعناصر هالمجموعة. والدالة متاحة بكل المتصفحات من آذار 2024.

## كيف كان الكود قبل، وكيف صار؟

قبل كنت تكتب reduce وتبني الـ object بإيدك، وهلق بتكتب سطر واحد بيقول شو بدك بالزبط: جمّع حسب الحالة.

خلينا ناخد قائمة طلبات:

```javascript
const orders = [
  { id: 1, status: "paid", total: 40 },
  { id: 2, status: "pending", total: 15 },
  { id: 3, status: "paid", total: 22 },
];
```

هيك كان التقسيم حسب الحالة:

```javascript
const byStatus = orders.reduce((groups, order) => {
  (groups[order.status] ??= []).push(order);
  return groups;
}, {});
```

وهيك صار:

```javascript
const byStatus = Object.groupBy(orders, (order) => order.status);
```

النتيجة نفسها: `byStatus.paid` فيها الطلبين يلي حالتهن `paid`، و`byStatus.pending` فيها الطلب التاني. والدالة بتاخد كمان رقم العنصر كمعامل تاني، فبتقدر تجمّع حسب أي شي بتحسبه، متل «بدها إعادة طلب» إذا الكمية قليلة.

## ليش hasOwnProperty ما بيشتغل على النتيجة؟

الـ hasOwnProperty ما بيشتغل على نتيجة Object.groupBy لأنو النتيجة object بلا prototype، يعني ما بتورث ولا دالة من Object.prototype.

نفس صفحة MDN بتقول إنو القيمة يلي بترجع object من نوع null-prototype، فكود قديم بيفحص المفاتيح بـ `hasOwnProperty` رح يوقع:

```javascript
byStatus.hasOwnProperty("paid"); // TypeError
Object.hasOwn(byStatus, "paid"); // true
```

حسب [صفحة Object.hasOwn على MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn)، الـ object يلي بلا prototype ما بيوصل لـ `hasOwnProperty`، و`Object.hasOwn` هي الطريقة المنصوح فيها لأنها بتشتغل عليه. ولما تقرا مجموعة ممكن ما تكون موجودة، اكتب `byStatus.refunded ?? []` لحتى ما تاخد `undefined`.

## إمتى بتحتاج Map.groupBy؟

بتحتاج Map.groupBy لما مفتاح المجموعة object مش نص، متل الزبون نفسه بدل اسمه، لأنو مفاتيح الـ object العادي بتتحوّل لنص.

صفحة MDN عن Object.groupBy بتقول استعملها لما أسماء المجموعات بتنكتب كنص، ولأي مفتاح تاني استعمل `Map.groupBy`. وحسب [صفحة Map.groupBy على MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy)، النتيجة Map، وبتوصل لكل مجموعة بنفس الـ object يلي استعملته مفتاح، مش بـ object تاني إله نفس الخصائص:

```javascript
const ali = { name: "Ali" };
const sara = { name: "Sara" };
const sales = [
  { customer: ali, total: 40 },
  { customer: sara, total: 15 },
  { customer: ali, total: 22 },
];

const byCustomer = Map.groupBy(sales, (sale) => sale.customer);
byCustomer.get(ali);
byCustomer.get({ name: "Ali" }); // undefined
```

ونفس الصفحة بتقول إنو العناصر بالمجموعات هي نفس عناصر المصفوفة الأصلية، مش نسخ عنها: إذا عدّلت طلب بمجموعة، بيتعدّل بالقائمة كمان.

## من وين تبلّش هلق؟

دوّر بمشروعك على `reduce` بيبني object من مصفوفات، أو على استيراد `groupBy` من مكتبة، وبدّل أول واحد بـ `Object.groupBy`. وإذا الكود بعده بيستعمل `hasOwnProperty` على النتيجة، بدّلها بـ `Object.hasOwn` بنفس الـ commit.

وإذا بدك نسخة مستقلة من المجموعات قبل ما تعدّل فيها، شوف [النسخ العميق بـ structuredClone](/articles/javascript-structuredclone-deep-copy)، ولدالة جاهزة تانية بتوفّر عليك كود، شوف [مهلة لطلبات fetch بـ AbortSignal.timeout](/articles/fetch-timeout-abortsignal). وإذا لسا عم ترتّب شو تتعلّم بعدين، [خارطة طريق المبرمج 2026](/products/roadmap-2026) بتساعدك ترتّبه.

كم reduce من هالنوع لقيت بمشروعك؟

## FAQ

**شو بيرجع Object.groupBy إذا مجموعة ما فيها ولا عنصر؟**

ما بيرجع إلها مفتاح أصلاً. المفاتيح بتطلع بس للقيم يلي رجّعتها الدالة، فإذا قريت مجموعة مش موجودة بتاخد undefined، والأحسن تكتب ?? [] وقت القراية.

**Object.groupBy بينسخ العناصر؟**

لأ. المجموعات فيها نفس الـ objects يلي بالمصفوفة الأصلية، فإذا عدّلت عنصر بمجموعة، بيتعدّل بالمصفوفة كمان. إذا بدك نسخة مستقلة، انسخ أول.

**بقدر أجمّع حسب أكتر من حقل؟**

إي. خلّي الدالة ترجّع نص فيه الحقلين، متل الحالة والمدينة مع فاصل بيناتهن. وإذا بدك مجموعات جوّا مجموعات، نادي groupBy تاني على كل مجموعة.
