Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การแบนอาร์เรย์หลายชั้นแบบไม่ใช้ Recursion ใน JavaScript

สมมติเรามี nested array ของตัวเลขแบบนี้:

const arr = [1, 4, 5, [
  5, 6, [
    6, 19, 5, [5]
  ], [5, 7, 6, [6, 8]], 8 ], 6];

เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับ nested array เข้ามา (ซ้อนได้ลึกเท่าไหร่ก็ได้) ฟังก์ชันควรคืนอาร์เรย์ใหม่ที่เป็น flattened version ของอินพุต

มีเงื่อนไขสองข้อที่ต้องหลีกเลี่ยง:

  • ห้ามใช้ custom recursive function ใดๆ ในโค้ด
  • ห้ามใช้ Array.prototype.flat() method

ตัวอย่างโค้ด

const arr = [1, 4, 5, [
  5, 6, [
    6, 19, 5, [5]
  ], [5, 7, 6, [6, 8]], 8 ], 6];
const flattenWithoutRecursion = (arr = []) => {
  const res = [];
  let level = 0, ref = [arr], counter = [0];
  while(level >= 0){
    if (counter[level] >= ref[level].length) {
      level--;
      continue;
    };
    if (Array.isArray(ref[level][counter[level]])) {
      ref[level + 1] = ref[level][counter[level]]
      counter[level]++;
      level++;
      counter[level] = 0;
      continue;
    };
    res.push(ref[level][counter[level]]);
    counter[level]++;
  };
  return res;
};
console.log(flattenWithoutRecursion(arr));

ผลลัพธ์

ผลลัพธ์ที่แสดงในคอนโซลจะเป็นดังนี้:

[
  1, 4, 5, 5, 6, 6,
  19, 5, 5, 5, 7, 6,
  6, 8, 8, 6
]