不能将 forEach 与 Filelist 一起使用

Posted

技术标签:

【中文标题】不能将 forEach 与 Filelist 一起使用【英文标题】:Can't use forEach with Filelist 【发布时间】:2017-04-15 14:33:57 【问题描述】:

我正在尝试遍历Filelist

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

如您所见,field.photo.files 有一个Filelist

如何正确循环field.photo.files

【问题讨论】:

Array.prototype.forEach.call(field.photo.files, file => console.log(file)); 不是数组吗?这是 node.js 吗? @connexo:不,field.photo.files 是在FileList 上原型化的对象;就像htmlCollection,它的原型链中没有Array.prototype 简单的for loop工作:) 【参考方案1】:

FileList 不是Array,但它确实符合其约定(具有length 和数字索引),因此我们可以“借用”Array 方法:

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

由于您显然使用的是 ES6,您也可以使用新的 Array.from 方法将其设为正确的 Array

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

【讨论】:

奇怪,我明白了:Building.vue?92ca:292 Uncaught (in promise) TypeError: Cannot convert undefined or null to object(…)Array.from 好吧,你确定你的变量是field.photo.files吗?我没有检查... @Amadan field.photo.files 正是console.log 在我的问题中显示的内容。 你也可以使用扩展运算符[...field.photo.files].map(file => ); @mcjlnrtwcz 除了易读性,我什么都想不出来。【参考方案2】:

您也可以使用简单的 for 进行迭代:

var files = field.photo.files;

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

【讨论】:

【参考方案3】:

在 ES6 中你可以使用:

[...field.photo.files].forEach(file => console.log(file));

参考:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/Destructuring_assignment

【讨论】:

【参考方案4】:

lodash 库有一个 _forEach 方法循环遍历所有集合实体,例如数组和对象,包括 FileList:

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

【讨论】:

【参考方案5】:

以下代码在 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);
   

【讨论】:

【参考方案6】:

如果您使用的是 Typescript,您可以执行以下操作: 对于类型为 FileList[]File[] 的变量 files,请使用:

for(let file of files)
    console.log('line50 file', file);

【讨论】:

以上是关于不能将 forEach 与 Filelist 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将异步与 ForEach 一起使用?

如何将 foreach 与二维对象数组一起使用?

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

如何将 foreach 与哈希引用一起使用?

将 <c:forEach> 与 HashMap 一起使用 [重复]

将 BOOST_FOREACH 与 std::map 一起使用