في بداية الأمر، يجب أن ندرك أن ES6 يوفر لنا العديد من الطرق الفعالة للقيام بمهام مثل البحث عن كائن في مصفوفة بناءً على إحدى خصائصه. في هذه الحالة، نريد البحث عن الكائن الذي يحمل اسم المستثمر في مصفوفة newData
. يمكننا استخدام دالة find
التي تقدمها JavaScript للقيام بذلك. ولكي نقوم بإضافة القيمة المناسبة لنستخدم علامات تبويب للتنظيم.
javascriptfor (let obj of originalData) {
let currinvestor = obj.investor;
let currinvestment = obj.investment;
let currvalue = obj.value;
// البحث عن الكائن في newData الذي يمثل المستثمر الحالي
let investorObj = newData.find(item => item.investor === currinvestor);
// إضافة قيمة الاستثمار للنوع المناسب
if (investorObj) {
investorObj[currinvestment] += currvalue;
}
}
console.log(newData); // لنرى النتيجة في الكونسول
ما يحدث هنا هو أننا نقوم بالمرور عبر مصفوفة originalData
باستخدام حلقة for..of
، وفي كل دورة من الحلقة، نقوم بالبحث عن الكائن المناسب في newData
باستخدام find
. إذا تم العثور على المستثمر، نضيف قيمة الاستثمار إلى النوع المناسب. وبعد الانتهاء من الحلقة، سيكون newData
محدثًا بالقيم المناسبة.
المزيد من المعلومات
بالطبع، دعنا نكمل المقال بتوضيح المفاهيم بشكل أكبر ونقدم بعض الأمثلة الإضافية لتوضيح الفكرة بشكل أفضل.
في الكود السابق، استخدمنا حلقة for..of
للمرور عبر كل كائن في originalData
. في كل دورة من الحلقة، قمنا بتخزين قيم خصائص المستثمر الحالي في متغيرات مؤقتة، مثل currinvestor
و currinvestment
و currvalue
.
ثم، استخدمنا دالة find
للبحث عن كائن في مصفوفة newData
يمثل المستثمر الحالي. إذا تم العثور على المستثمر، قمنا بإضافة قيمة الاستثمار إلى النوع المناسب (currinvestment
). يتم ذلك عن طريق زيادة قيمة الخاصية المناسبة في الكائن الموجود في newData
.
ولكن، قد تواجه مشكلة إذا لم يتم العثور على المستثمر في newData
، مما يؤدي إلى أنه سيتم إضافة undefined
إلى currvalue
، وبالتالي ستكون العملية غير فعالة. لذا، يمكن أن نقوم بإضافة شرط إضافي للتحقق مما إذا كان المستثمر موجودًا أم لا قبل إجراء الإضافة.
بالإضافة إلى ذلك، يمكن أن نقوم بتحسين الكود عن طريق استخدام دالة reduce
بدلاً من حلقة for..of
للتعامل مع originalData
. هذا يمكن أن يجعل الكود أكثر إنسيابية وأقل تعقيدًا.
إليك الكود المحسن:
javascriptconst newData = originalData.reduce((accumulator, currentValue) => {
const { investor, investment, value } = currentValue;
const investorObj = accumulator.find(item => item.investor === investor);
if (investorObj) {
investorObj[investment] += value;
} else {
accumulator.push({ investor, [investment]: value, options: 0, savings: 0 });
}
return accumulator;
}, [
{ investor: "Sue", stocks: 0, options: 0, savings: 0 },
{ investor: "Rob", stocks: 0, options: 0, savings: 0 },
{ investor: "Liz", stocks: 0, options: 0, savings: 0 }
]);
console.log(newData); // نطبع النتيجة في الكونسول
هذا الكود يستخدم دالة reduce
لدمج originalData
إلى newData
، ويتحقق من وجود المستثمر في كل دورة من الحلقة. إذا تم العثور على المستثمر، يتم إضافة قيمة الاستثمار. وإذا لم يتم العثور على المستثمر، يتم إضافة كائن جديد لـ newData
يمثل هذا المستثمر مع قيمة الاستثمار الجديدة.
بهذه الطريقة، يتم إنشاء مصفوفة جديدة تحتوي على مجموع قيم الاستثمار لكل شخص، مما يوفر لنا نظرة شاملة عن كيفية توزيع الاستثمارات بين المستثمرين.