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

การ Parse อาร์เรย์ของออบเจกต์ภายในออบเจกต์อีกทีหนึ่ง (Duplicate)

บทความนี้มีเนื้อหาเหมือนกับ ID 1004057933 สมบูรณ์แบบ จึงขออธิบายเพิ่มเติมเกี่ยวกับ Optional Chaining และ Nullish Coalescing ที่ช่วยทำให้โค้ดปลอดภัยกว่า

โค้ดปรับปรุงให้ปลอดภัย (Safe Parsing)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Safe Parse Nested</title>
  <style>
    body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
    .result { font-size: 18px; font-weight: 500; color: rebeccapurple; }
  </style>
</head>
<body>
  <h1>Parse Nested Objects อย่างปลอดภัย</h1>
  <div class="result"></div>
  <button class="Btn">คลิกที่นี่</button>
  <h3>คลิกเพื่อ parse JSON object ด้วย Optional Chaining</h3>
  <script>
    const json = {
      storeData: [
        {
          items: [
            { itemID: 12, cost: { costNum: 100 } },
            { itemID: 22, cost: { costNum: 250 } },
            { itemID: 19, cost: { costNum: 350 } }
          ]
        }
      ]
    };
    
    const resEle = document.querySelector(".result");
    
    document.querySelector(".Btn").addEventListener("click", () => {
      // ใช้ Optional Chaining (?.) และ Nullish Coalescing (??)
      const total = json.storeData
        .flatMap(store => store.items ?? [])
        .reduce((sum, item) => sum + (item.cost?.costNum ?? 0), 0);
      
      json.storeData.forEach(store => {
        (store.items ?? []).forEach(item => {
          resEle.innerHTML += `itemID: ${item.itemID} costNum: ${item.cost?.costNum ?? 'N/A'}<br>`;
        });
      });
      
      resEle.innerHTML += `Total: ${total}<br>`;
    });
  </script>
</body>
</html>

คำอธิบายเทคนิคใหม่

  • ?. (Optional Chaining): เข้าถึง property แบบปลอดภ ไม่ error ถ้าค่าเป็น null/undefined
  • ?? (Nullish Coalescing): ให้ค่า default เฉพาะเมื่อค่าเป็น null หรือ undefined เท่านั้น (ไม่ใช่ falsy อื่นๆ)
  • flatMap: รวม map + flat ระดับเดียว สะดวกกว่า nested forEach

ผลลัพธ์

แสดง itemID และ costNum ของแต่ละรายการ พร้อมผลรวม 700