[英]Why isn't the FileList object an array?
文檔: https : //developer.mozilla.org/en-US/docs/Web/API/FileList
為什么FileList
是一個對象而不是一個數組? 它擁有的唯一屬性是.length
並且它擁有的唯一方法是.item()
,這是多余的( fileList[0] === fileList.item(0)
)。
嗯,可能有幾個原因。 一方面,如果它是一個數組,你可以修改它。 您不能修改FileList
實例。 其次但相關,它可能(可能是)瀏覽器數據結構的視圖,因此最小的功能集使實現更容易提供它。
您可以通過a = Array.from(theFileList)
(這是一種 ES2015 方法,但對它進行 polyfill)或通過a = Array.prototype.slice.call(theFileList)
將其轉換為數組。
2018 年更新:不過,有趣的是,規范在FileList
上有一個注釋:
FileList
接口應該被視為“有風險”,因為 Web 平台的總體趨勢是用 ECMAScript [ECMA-262] 中的Array
平台對象替換此類接口。 特別是,這意味着排序filelist.item(0)
語法存在風險;FileList
大多數其他編程使用不太可能受到最終遷移到Array
類型的影響。
我覺得那張紙條很奇怪。 我認為趨勢是iterable
,而不是Array
— 例如更新NodeList
將其標記為iterable
以兼容擴展語法for-of
和forEach
。
有了es6,我們現在可以
const files = [...filesList]
很有用,例如,如果您想map
這些
我認為它是它自己的數據類型,因為面向對象編程在定義時比函數式編程更重要。 現代 Javascript 提供了將類數組數據類型轉換為數組的功能。
例如,像 Tim 描述的那樣: const files = [...filesList]
另一種使用 ES6 迭代 FileList 的方法是 Array.from() 方法。
const fileListAsArray = Array.from(fileList)
IMO 它比擴展運算符更具可讀性,但另一方面它的代碼更長:)
如果您想在 FileList 上使用數組方法,請嘗試apply
例如:
Array.prototype.every.call(YourFileList, file => { ... })
如果你想使用每個
這里有幾個toObject()
向File
添加了一個toObject()
函數,向FileList
添加了一個toArray()
函數:
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()
似乎擴展運算符[...yourFileList]
比Array.from(yourFileList)
性能更高。 https://stackoverflow.com/a/63818423/971695
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.