如何在 javascript 中读取对象文件列表数组?

Posted

技术标签:

【中文标题】如何在 javascript 中读取对象文件列表数组?【英文标题】:How can i read an object filelist array in javascript? 【发布时间】:2013-01-27 06:27:12 【问题描述】:

我创建了一个数组来存储选定文件的列表。好吧,老实说,我查看了代码,当我意识到它可以满足我的目的时,我就使用了它。现在我需要访问这个数组来手动删除一些文件,但是我尝试过使用每个扇区的索引,但这不起作用。

这就是我创建数组和存储文件的方式。

 var files = [];
 $("button:first").on("click", function(e) 
                $("<input>").prop(
                    "type": "file",
                    "multiple": true
                ).on("change", function(e) 
                    files.push(this.files);
                ).trigger("click");

);

如果数组 files[] 包含对象 fileList 或从数组中获取索引,我如何读取它?

【问题讨论】:

【参考方案1】:

我是这样理解你的代码的:

每次单击 dom 中的第一个按钮时,都会生成一个接受多个文件的文件输入对话框。返回时,对话会发出一个change 事件,其中一个files 变量(一个FileList 对象)附加到函数上下文(this)。您的代码将新创建的 FileList 推送到 files 数组中。由于输入接受多个文件,因此推入files 数组的每个对象都是一个 FileList 对象。

因此,如果您想遍历 files 数组中的所有元素,您可以在 change 事件处理程序中放置一个函数:

var files = [];
$("button:first").on("click", function(e) 
    $("<input>").prop(
        "type": "file",
        "multiple": true
    ).on("change", function(e) 
        files.push(this.files);
        iterateFiles(files);
    ).trigger("click");
);


function iterateFiles(filesArray)

    for(var i=0; i<filesArray.length; i++)
        for(var j=0; j<filesArray[i].length; j++)
            console.log(filesArray[i][j].name);
            // alternatively: console.log(filesArray[i].item(j).name);
        
    

在我写的iterateFiles() 函数中,filesArray[i][j] 并不是一个真正的多维数组——而是一个包含 FileList 对象的单维数组,其行为与数组非常相似……除了你不能删除/拼接其中的项目——它们是只读的。

有关您无法删除的原因的更多信息,请参阅:How do I remove a file from the FileList

【讨论】:

让我告诉你:“总有一天,我希望在编程方面达到你的一半。”是的,我真诚地说。读完后,我了解到 filelist 对象是只读的,所以我不得不重新考虑如何发送额外的数据。因此,我创建了另外两个数组:一个包含文件的索引,另一个包含用户想要删除的文件。我通过 ajax 将这两个数据与 objectFilelist 一起发送,并使用 php 文件,我做了所有的魔法。这是一个痛苦的,但是,它可以执行。非常感谢你。 @MichaelVidal 你是怎么做到的。我一直在寻找那种解决方案,但我做不到。请帮帮我【参考方案2】:

由于您使用的是 jQuery,因此您可以使用 $.grep

files=$.grep( files, function(elementOfArray, indexInArray)
       /* evaluate by index*/
       return indexInArray != someValue;
       /* OR evaluate by element*/
       return  elementOfArray != someOtherValue;
);

API 参考:http://api.jquery.com/jQuery.grep/

【讨论】:

我想在FileList 对象上使用Array.prototype.some,但它不是一个数组。我想我可以尝试转换它,但是这个grep 解决方案与我的....length &gt; 0 添加配对给了我一个很好的布尔值。在 API 中一目了然没有看到这个函数,谢谢! @Pysis 可以在 Filelist 或其他数组(如对象)上使用 [].some.call()【参考方案3】:

这样的?

for(var i = 0; i < files.length; i++) 
   alert(files[i][0].name);
   if (files[i][0].name == 'file.jpg') 
      files.splice(i, 1) //remove the item
   

也就是说,由于您选择它的方式,每个 FileList 中始终存在一个文件。因此,对于每个文件列表,您只对其中的第一个文件感兴趣。对于每个文件,您只需获取此处定义的属性:http://help.dottoro.com/ljbnqsqf.php

【讨论】:

以上是关于如何在 javascript 中读取对象文件列表数组?的主要内容,如果未能解决你的问题,请参考以下文章

java读取文件中多个数据,放入不同数组

如何在javascript中从json文件中读取数据

如何读取 XML 文件并将信息放入对象中?

如何使用 Spring 批处理处理对象列表

Javascript:如何遍历模型中的对象列表

vue如何将一个json文件传到另一个