؟ لقد خرج أخيرًا! لم تعد هناك حاجة لكتابة تعليمات برمجية قبيحة لتجميع مجموعة من الكائنات حسب قيمة محددة للحقل!
منذ أواخر عام 2023، هناك طريقة ثابتة رسمية للكائن تسمى groupBy() تقوم بذلك نيابةً عنا!
فهو يقبل عنصرًا قابلاً للتكرار، مثل المصفوفة، ووظيفة يتم تنفيذها لكل عنصر ويجب أن يُرجع "فئة" ذلك العنصر المحدد.
تقوم الطريقة بإرجاع كائن جديد حيث يكون كل مفتاح عبارة عن فئة مختلفة تحتوي على مجموعة من الكائنات التي تنتمي إلى تلك الفئة المحددة.
ملاحظة: العناصر الموجودة في الكائن الذي تم إرجاعه والعنصر الأصلي القابل للتكرار هي نفسها (وليست نسخًا عميقة!). سوف ينعكس تغيير البنية الداخلية للعناصر في كل من الكائن الأصلي القابل للتكرار والكائن الذي تم إرجاعه.
دعونا نعطي مثالا عمليا لنرى مدى سهولة تجميع جميع شخصيات سلاحف النينجا حسب العمر.
const ninjaTurtlesCharacters = [ { age: 16, name: 'Michelangelo' }, { age: 16, name: 'Raffaello' }, { age: 16, name: 'Donatello' }, { age: 16, name: 'Leonardo' }, { age: 91, name: 'Splinter' }, { age: 25, name: 'Casey Jones' }, { age: 25, name: 'April O\'Neil' } ];
const ninjaTurtlesCharactersByAge = ninjaTurtlesCharacters.reduce( (groupedPeople, item) => ({ ...groupedPeople, [item.age]: groupedPeople[item.age] ? [...groupedPeople[item.age], item] : [item], }), {} );
const ninjaTurtlesCharactersByAgeNew = Object.groupBy( ninjaTurtlesCharacters, ({ age }) => age );
نصيحة: استخدم Map.groupBy() إذا كنت تريد إرجاع خريطة بدلاً من كائن
{ "16": [ { age: 16, name: 'Michelangelo' }, { age: 16, name: 'Raffaello' }, { age: 16, name: 'Donatello' }, { age: 16, name: 'Leonardo' } ], "25": [ { age: 25, name: 'Casey Jones' }, { age: 25, name: 'April O\'Neil' } ], "91": [ { age: 91, name: 'Splinter' } ] }
؟؟؟ كالعادة، قمت بإنشاء مشروع Stackblitz بسيط للعب بالرمز.
؟ المستندات: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy
ℹ دعم المتصفح: https://caniuse.com/mdn-javascript_builtins_object_groupby
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3