Неможливо використовувати forEach зі списком файлів


133

Я намагаюся провести цикл через 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));
Толгахан Альбайрак

Це не масив? Це node.js?
підключення

@connexo: Ні, field.photo.filesце об'єкт, прототип якого ввімкнено FileList; так само HTMLCollection, як його немає Array.prototypeв своєму прототипі ланцюга.
Амадан

Проста for loopробота :)
Реза

Відповіді:


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 field.photo.files- саме те, що console.logпоказує в моєму питанні.
alex

@Amadan Damn, це був помилковий помилок. Вибачте.
alex

11
ви також можете скористатися оператором розкидання[...field.photo.files].map(file => {});
Генріх Кантуні

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);
      }
    }

-2

Якщо ви використовуєте Typescript, ви можете зробити щось на зразок цього: Для змінної "файлів" з типом FileList [] або File [] використовуйте:

for(let file of files){
    console.log('line50 file', file);
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.