Dibo

تسمع عن flatMap في javascript؟

هي Array method بتجمع بين map و flat مع بعض في خطوة واحدة .. بس الاول خلونا نتعرف علي كل واحدة فيهم ع السريع كدة ونرجع لـ flatMap تاني

اية هي Map في javascript؟

هي callback بتتنفذ علي كل عناصر الـ array بحيث نغير قيم كل العناصر في خطوة واحدة ومن غير ما نحتاج نعمل loop

مثال

let array = [1, 2, 3];
let squareValues = array.map(el => el * 2);
console.log(squareValues);
// result: [2, 4, 6]

زي مانت شايف في المثال دة, احنا حابين نضاعف كل عنصر من عناصر array في خطوة واحدة

اية هي flat في javascript

لو عندي array جواها arrays وعاوز انقل كل عناصر ال array الداخلية للـ top level ف flat هتقدر تنفذ دة في خطوة واحدة

مثال:

// we need to flatter the internal array [3, 4]let array = [1, 2, [3, 4]];
let flattenedArray = array.flat();
console.log(flattenedArray);
// result: [1, 2, 4, 4]

لو تلاحظ في ال array الاصلية ان جواها sub array داخلية, بس احنا عاوزين نستخرج عناصرها للـ array الاصلية

طب من غير flat كنا هنفذ حاجة زي كدة ازاي؟ تعالي نجرب

let array = [1, 2, [3, 4]];
let flattenedArray = [];
for(let i=0; i < array.length; i++){
  if(Array.isArray(array[i])){
    // use the spread operator to push each internal element
    flattenedArray.push(...array[i])
  } else {
    flattenedArray.push(array[i])
  }
}

شوفت بأة flat وفرت علينا مجهود أد اية

تعالوا نشوف مثلا use case حقيقية لـ flat قابلتني في مشروع حقيقي

كنت بعمل function بتجيب كل الملفات اللي بتحقق criteria معينة من فلدر معين وكل ال subfolders وال sub folders of subfolders لغاية الـ depth المحدد (اللي هو افتراضيا مالا نهايا)

زي مانت متوقع دلوقت ان الـ function بترجع بـ array جواها paths اللي بقاها

وطبعا الـ function دي لازم تتنفذ recursively علي كل subfolder تلاقيه قدامها, وبالتالي النتيجة ممكن تكون array جواها strings و arrays

انا هنا عاوز النتيجة النهائية ترجعلي علي هيئة array واحدة جواها strings فقط من غير اي sub array فطبعا لجأت هنا لflat

ممكن الكود يكون حاجة زي كدة (مختصر للتوضيح فقط)

function getFiles(path: string = '.'){
 let files = readdirSync(path),
 result: string[] = [];

 for(let file of files){
  let fullPath = ....
  // this results in a sub array inside our results[] 
  // `arrauif(isDir(file)) result.push(...getFiles(fullPath))`
  else result.push(fullPath)
 }
 return result;
}

زي مانت شايف كدة ان خطوة الـ recursive اللي حصلت في النص اتسببت ان result بأة جواها array بس احنا عاوزين نحط عناصر ال array مش الـ array نفسها

ودة بسبب انها ممكن تتنفذ كذا مرة داخليا (يعني لو في فولدر جوة فولدر جوة فولدر)

هنا بأة flat ممكن تفيدنا وممكن نعمل تعديل بسيط علي الكود بتاعنا

return result.flat();

اية هي flatMap في جافاسكريبت؟

دلوقت نقدر نتكلم عن flatMap واحنا فاهمين .. هي طريقة بنجمع بيها بين map و flat مع بعض

يعني من الاخر بنسطح الـ array الاول وبعد كدة بنفذ الـ mapper علي كل عنصر من عناصرها في خطوة واحدة

يعني Array.flatMap تكافئ Array.map().flat

let array = [1, 2, 3];

// using flatMaplet result1 = array.flatMap((el) => [el, el * 2]);
console.log(result1);
// result: [1, 2, 2, 4, 3, 4]

// using map() and flat() separatelylet arrayMap = array.map(el=> [el, el* 2]);
// outputs: [ [1, 2], [2, 4], [3, 6]let result2 = arrayMap.flat()
// outputs: [1, 2, 2, 4, 3, 6]