我有以下代码:
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
。是否可以比较File
内的Array
个对象,以便我可以避免向数组添加重复项?
答案 0 :(得分:0)
这是一个看似复杂的问题。
考虑到你有一个场景,其中两个文件几乎完全相同,除了文件之间的单个字符差异。
当JavaScript使用一些基本字符串执行inArray函数时,它能够比较每个字母以确保数据相同。
但是,对于文件,JavaScript不会让您不小心执行逐字母的文件比较,因为在处理方面的比较有多么极端。
在这些情况下(事实上,通常包含所有对象),数据汇总为[File]
或[Object]
或其他。
那就是说,你需要一种方法来重新启用文件的比较。
您需要稍微修改一下您的方法。
例如,您可以比较文件的MD5哈希值。 MD5旨在将整个文件转换为短32个字母的字符串。这有点像文件内容的“摘要”。如果更改文件的单个字母并对其执行MD5,则整个MD5哈希值将更改。
这允许您比较具有极低“碰撞”风险的文件(其中两个完全不同的文件将具有相同的MD5哈希。我必须强调这种情况很少发生)
或者,您可以声明具有相同文件名的文件是同一个文件 - 但这可能不适用于您的实现或产品。例如,此解决方案可能旨在接受所有具有相同名称的10个文件。
但是,如果认为文件名足以告诉两个文件,只需在readOnlyFiles
旁边保留一个辅助数组(可能类似readOnlyFilenames
)并将其用于比较。您只需要确保阵列保持同步。如果从一个元素中删除元素,则必须将其从另一个元素中删除。这允许您拥有文件数据与文件名的查找表。
答案 1 :(得分: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]);
}