تجميع الكائنات حسب خصائص متعددة وتجميع القيم
في مهمة تجميع الكائنات في مصفوفة حسب خصائص متعددة، هناك متطلب شائع هو: لا يقتصر الأمر على التجميع حسب هذه الخصائص فحسب، بل يجمع أيضًا قيم خصائص معينة للكائن. ومع ذلك، فإن الحل الذي يقوم ببساطة بتضمين جميع التكرارات في مصفوفة ثنائية الأبعاد غير كافٍ.
بيان المشكلة
ضع في اعتبارك مصفوفة من الكائنات التي يجب تجميعها حسب الشكل و لون. تعتبر الكائنات الموجودة في هذه المصفوفة مكررة فقط إذا كان شكلها ولونها متماثلين. بالنسبة للكائنات المكررة، نحتاج إلى تلخيص قيمها المستخدمة وقيم المثيلات وإزالة التكرارات، مما يؤدي إلى قائمة مختصرة من الكائنات ذات الأشكال والألوان الفريدة.
الحل
لحل هذه المشكلة بشكل فعال، يمكننا الاستفادة من طريقة Array#reduce بالتزامن مع كائن مساعد يتتبع مجموعات الأشكال والألوان التي تمت مواجهتها:
const arr = [ { shape: 'square', color: 'red', used: 1, instances: 1 }, { shape: 'square', color: 'red', used: 2, instances: 1 }, { shape: 'circle', color: 'blue', used: 0, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 4 }, { shape: 'circle', color: 'red', used: 1, instances: 1 }, { shape: 'circle', color: 'red', used: 1, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 5 }, { shape: 'square', color: 'red', used: 2, instances: 1 }, ]; const helper = {}; const result = arr.reduce((r, o) => { const key = `${o.shape}-${o.color}`; if (!helper[key]) { // If it's a unique combination, add to the helper and result array helper[key] = Object.assign({}, o); r.push(helper[key]); } else { // If it's a duplicate, update the values in the helper helper[key].used = o.used; helper[key].instances = o.instances; } return r; }, []); console.log(result);
الإخراج:
[ { shape: "square", color: "red", used: 5, instances: 3 }, { shape: "circle", color: "red", used: 2, instances: 1 }, { shape: "square", color: "blue", used: 11, instances: 9 }, { shape: "circle", color: "blue", used: 0, instances: 0 } ]
يقوم هذا الحل بتجميع الكائنات بكفاءة حسب الشكل واللون، وتجميع قيمها المستخدمة وقيم المثيلات للكائنات المكررة، وإزالة أي تكرارات متبقية، مما يؤدي إلى الإخراج المطلوب.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3