Não é possível usar o forEach with Filelist


133

Estou tentando fazer um loop através de um Filelist:

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

Como você pode ver, field.photo.filestem um Filelist:

insira a descrição da imagem aqui

Como fazer um loop corretamente field.photo.files?


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

Não é uma matriz? É este node.js?
Connex1

@connexo: Não, field.photo.filesé um objeto com protótipo FileList; assim como HTMLCollection, ele não tem Array.prototypeem sua cadeia de protótipos.
Amadan 01/12/16

for loopTrabalho simples :)
Reza

Respostas:


265

A FileListnão é um Array, mas está em conformidade com seu contrato (possui lengthe índices numéricos), para que possamos "emprestar" Arraymétodos:

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

Como você obviamente está usando o ES6, também pode torná-lo adequado Array, usando o novo Array.frommétodo:

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

Estranho, eu entendi: Building.vue?92ca:292 Uncaught (in promise) TypeError: Cannot convert undefined or null to object(…)com Array.from.
alex

Bem, você tem certeza de que sua variável é field.photo.files? Eu não estava verificando que ...
Amadan

@Amadan field.photo.filesé exatamente o que os console.logshows na minha pergunta.
alex

@ Dammad Damn, foi um erro de digitação. Desculpe.
alex

11
você também pode usar o operador de spread[...field.photo.files].map(file => {});
Henrikh Kantuni 30/0318

33

Você também pode iterar com um simples para:

var files = field.photo.files;

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


3

A biblioteca lodash possui um método _forEach que percorre todas as entidades da coleção, como matrizes e objetos, incluindo o FileList:

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

0

O código a seguir está em Texto Dactilografado

     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

Se você estiver usando o Typecript, poderá fazer algo assim: Para uma variável 'files' com o tipo FileList [] ou File [], use:

for(let file of files){
    console.log('line50 file', file);
  }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.