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

การเปลี่ยนรูปอาร์เรย์ 2 มิติใน JavaScript

ปัญหา

เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ 2 มิติของตัวเลข arr เป็นอาร์กิวเมนต์แรก และสองตัวเลข r และ c แทนจำนวนแถวและคอลัมน์ของเมทริกซ์ที่ต้องการตามลำดับ ฟังก์ชันควรสร้างและคืนค่าอาร์เรย์ 2 มิติใหม่ที่มีแถวและคอลัมน์ตามที่ระบุในลำดับ row-traversing เดียวกับอาร์เรย์อินพุต

เช่น ถ้าอินพุตคือ:

const arr = [
  [6, 7],
  [8, 9]
];
const r = 1, c = 4;

ผลลัพธ์ควรเป็น:

const output = [[6, 7, 8, 9]];

คำอธิบายผลลัพธ์

Row-traversing ของ arr คือ [6, 7, 8, 9] เมทริกซ์ใหม่ reshape เป็น 1×4 เติมแถวต่อแถวจากลิสต์ก่อนหน้า

ตัวอย่าง

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

const arr = [
  [6, 7],
  [8, 9]
];
const r = 1, c = 4;
const reshapeArray = (arr, r, c) => {
  if (r * c !== arr.length * arr[0].length) {
    return arr;
  }
  const res = [];
  let row = [];
  arr.forEach(items => items.forEach((num) => {
    row.push(num);
    if (row.length === c) {
      res.push(row);
      row = [];
    }
  }));
  return res;
};
console.log(reshapeArray(arr, r, c));

ผลลัพธ์

[[6, 7, 8, 9]]

คำอธิบายเพิ่มเติม

Reshape matrix (คล้าย numpy.reshape) ตรวจสอบขนาดรวมเท่ากัน (r*c === original) แล้ว flatten row-major และ chunk เป็นแถวใหม่ ยกเว้นกรณีขนาดไม่ตรง คืนค่าเดิม