2017-05-10 63 views
1

我有以下代码:jQuery的数组包含File对象

function generateFileArea() { 
    fileDialog.on('change', function (event) { 
     console.log('File dialog changed.'); 

     var fileHeaderHTMLElement = $('#file-names-wrapper'); 

     fileHeaderHTMLElement.css('visibility', 'visible'); 

     readOnlyFiles = fileDialog[0].files;//<= File objects 

     // 

     for(index = 0; index < readOnlyFiles.length; index++){ 
      if($.inArray(readOnlyFiles[index], files) > -1){ // <== always -1 
       console.log('This file is already in the array.'); 
       continue; 
      } 

      // console.log(jQuery.inArray(readOnlyFiles[index], files)); 

      files.push(readOnlyFiles[index]); 
     } 

     console.log(files); 

     if (files.length == 0) 
      return; 

     fileNamesTable.empty();//<= this is a list 

     for(index = 0; index < files.length; index++) { 
      createFileButton(files[index]); 
     } 
    }); 
} 

我怎样才能让这个在inArray功能不会每次我核实该文件是重复的时间返回-1。是否可以比较Array中的File对象,以便我可以避免将重复项添加到数组中?

回答

0

这是一个看似复杂的问题。

考虑你有两个文件几乎完全相同的情况,除了文件之间的单个字符差异。

当JavaScript使用一些基本字符串执行inArray函数时,它可以比较每一个字母以确保数据是相同的。

但是,对于文件,JavaScript不会让您意外地执行逐个字母的文件比较,因为比较在处理方面会有多极端。

在这些情况下(实际上,所有对象一般情况下)数据总结为[File][Object]或其他东西。

也就是说,您需要一种方法来重新启用文件比较。

您需要稍微修改您的方法。

例如,您可以将比较文件的MD5哈希值。 MD5旨在将整个文件转换为一个简短的32个字母的字符串。这有点像文件内容的“摘要”。如果您更改文件的单个字母并在其上执行MD5,则整个MD5哈希将会更改。

这使您可以用很低的“碰撞”的风险比较文件(其中两个完全不同的文件有相同的MD5哈希值。我必须强调,这种情况很少见)

或者,你可以断言具有相同文件名的文件是相同的文件 - 但这可能不适用于您的实施或产品。例如,此解决方案可能旨在接受全部具有相同名称的10个文件。

但是,如果文件名被认为足以分辨两个文件,只需将一个辅助数组与readOnlyFiles(可能类似于readOnlyFilenames)并将其用于比较。你只需要确保数组保持同步。如果您从一个元素中删除元素,则必须从另一个元素中删除它。这使您可以拥有文件数据与文件名称的查找表。

+1

感谢您的回答,这很有道理。我已经在'for'循环中添加了这段代码,但即使文件不同,它仍会向我显示相同的校验和。 'for(index = 0; index Justplayit

+0

基于这个解释,我的想法是你的散列函数只是比较单词'[File]'而不是试图读取二进制数据。也许将文件的内容存储到数组中会将文件转换为字符串。玩耍一下,尝试获取控制台中显示的一些真实文件数据。如果你能做到这一点,你应该能够把它扔在一个MD5函数没有问题 – 1owk3y

+0

也是我的道歉,我忽视提供给你一个MD5的JS库...但似乎你发现了一个看起来很理想的jQuery插件。总是很高兴看到一个StackOverflow用户实际考虑答案和他们的实现 - 而不是坚持一些代码可以复制粘贴,然后抱怨它没有工作,因为他们没有阅读说明:) – 1owk3y

0

尝试多种解决方案,如使用=====运营商之后,我拿出解决方案进行比较我要推到数组的大小和我已经在我的阵列与一个文件名。

for(index = 0; index < readOnlyFiles.length; index++){ 
     wasFound = false; 

     if(files.length > 0) 
      for(secondIndex = 0; secondIndex < files.length; secondIndex ++){ 
       if(files[secondIndex].name == readOnlyFiles[index].name && 
        files[secondIndex].size == readOnlyFiles[index].size){ 
        wasFound = true; 
        break; 
       } 
      } 

      if(wasFound === true){ 
       console.log('Already in the file list'); 
       continue; 
      } 

     files.push(readOnlyFiles[index]); 
    } 
+1

如果两个文件具有相同的文件大小和文件名 - 但内容完全不同?这个解决方案可行,但它很容易被利用和碰撞。 – 1owk3y

相关问题