ไม่สามารถใช้ forEach กับ Filelist


135

ฉันพยายามวนซ้ำFilelist:

console.log('field:', field.photo.files)
field.photo.files.forEach(file => {
   // looping code
})

อย่างที่คุณเห็นfield.photo.filesมีFilelist:

ใส่คำอธิบายภาพที่นี่

วิธีการวนซ้ำอย่างถูกต้องfield.photo.files?


2
Array.prototype.forEach.call(field.photo.files, file => console.log(file));
Tolgahan Albayrak

มันไม่ใช่อาร์เรย์? node.js นี้หรือเปล่า
connexo

@connexo: ไม่field.photo.filesเป็นวัตถุต้นแบบบนFileList; เช่นเดียวกับที่HTMLCollectionไม่มีArray.prototypeในห่วงโซ่ต้นแบบ
Amadan

for loopงานง่ายๆ:)
Reza

คำตอบ:


265

A FileListไม่ใช่Arrayแต่เป็นไปตามสัญญา (มีlengthและดัชนีตัวเลข) ดังนั้นเราจึงสามารถ "ยืม" Arrayวิธีการ:

Array.prototype.forEach.call(field.photo.files, function(file) { ... });

เนื่องจากคุณใช้ ES6 อย่างชัดเจนคุณสามารถทำให้เหมาะสมArrayได้โดยใช้Array.fromวิธีการใหม่:

Array.from(field.photo.files).forEach(file => { ... });

แปลกฉันได้รับสิ่งนี้: Building.vue?92ca:292 Uncaught (in promise) TypeError: Cannot convert undefined or null to object(…)ด้วยArray.from.
alex

คุณแน่ใจหรือว่าตัวแปรของคุณคือfield.photo.files? ฉันไม่ได้ตรวจสอบว่า ...
Amadan

@Amadan field.photo.filesเป็นสิ่งที่console.logแสดงในคำถามของฉัน
alex

@ อามดันด่ามันพิมพ์ผิด ขอโทษ
alex

11
คุณยังสามารถใช้ตัวดำเนินการกระจาย[...field.photo.files].map(file => {});
Henrikh Kantuni

33

คุณยังสามารถทำซ้ำได้ด้วยวิธีง่ายๆสำหรับ:

var files = field.photo.files;

for (var i = 0; i < files.length; i++) {
    console.log(files[i]);
}


3

lodashห้องสมุดมี_forEachวิธีการที่ลูปผ่านทุกหน่วยงานคอลเลกชันเช่นอาร์เรย์และวัตถุรวมทั้ง FileList:

_.forEach(field.photo.files,(file => {
     // looping code
})

0

รหัสต่อไปนี้อยู่ใน typescript

     urls = new Array<string>();

     detectFiles(event) {
       const $image: any = document.querySelector('#file');
       Array.from($image.files).forEach((file: any) => {
       let reader = new FileReader();
       reader.onload = (e: any) => { this.urls.push(e.target.result); }
       reader.readAsDataURL(file);
      }
    }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.