Dokumentation: https://developer.mozilla.org/en-US/docs/Web/API/FileList
Warum ist FileList
ein Objekt eher ein Array als ein Array? Die einzige Eigenschaft, die es hat, ist .length
und die einzige Methode, die es hat .item()
, ist redundant ( fileList[0] === fileList.item(0)
).
javascript
Vladimir Kornea
quelle
quelle
NodeList
s undHTMLCollection
s. Was ist beispielsweise, wenn eine Sprache diefoo[bar]
Syntax nicht unterstützt ?Antworten:
Nun, es kann mehrere Gründe geben. Zum einen könnten Sie ein Array ändern, wenn es sich um ein Array handelt. Sie können eine
FileList
Instanz nicht ändern . Zweitens, aber verwandt, könnte es sich (wahrscheinlich) um eine Ansicht einer Browser-Datenstruktur handeln, sodass ein minimaler Satz von Funktionen es für Implementierungen einfacher macht, diese bereitzustellen.Sie können es über
a = Array.from(theFileList)
(das ist eine ES2015-Methode, aber es ist trivial, es zu füllen) oder über in ein Array konvertierena = Array.prototype.slice.call(theFileList)
.Update im Jahr 2018: Interessanterweise enthält die Spezifikation jedoch einen Hinweis zu
FileList
:Ich finde diese Notiz seltsam. Ich dachte, der Trend geht in Richtung
iterable
, nichtArray
- wie das Update, umNodeList
esiterable
für die Kompatibilität mit der Spread-Syntax zu markierenfor-of
, undforEach
.quelle
.push()
und andere Array-Methoden.Ich denke, es ist ein eigener Datentyp, weil objektorientierte Programmierung mehr eine Sache war als funktionale Programmierung, als sie definiert wurde. Modernes Javascript bietet Funktionen zum Umwandeln von Array-ähnlichen Datentypen in Arrays.
Zum Beispiel wie Tim beschrieben:
const files = [...filesList]
Eine andere Möglichkeit, eine FileList mit ES6 zu iterieren, ist die Array.from () -Methode.
const fileListAsArray = Array.from(fileList)
IMO ist es besser lesbar als der Spread-Operator, aber andererseits ist es längerer Code :)
quelle
Wenn Sie Array-Methoden für FileList verwenden möchten, versuchen Sie es
apply
Also zum Beispiel:
Array.prototype.every.call(YourFileList, file => { ... })
wenn du jeden benutzen willst
quelle
Hier sind einige Polyfills, die eine
toObject()
FunktionFile
und einetoArray()
Funktion hinzufügenFileList
:File.prototype.toObject = function () { return Object({ lastModified: parseInt(this.lastModified), lastModifiedDate: String(this.lastModifiedDate), name: String(this.name), size: parseInt(this.size), type: String(this.type) }) } FileList.prototype.toArray = function () { return Array.from(this).map(function (file) { return file.toObject() }) } var files = document.getElementById('file-upload').files var fileObject = files[0].toObject() var filesArray = files.toArray()
quelle