数组长度不等于数组对象

时间:2013-11-27 22:59:31

标签: javascript arrays

下面的代码基本上遍历已删除的文件,将文件对象推送到filesArray中,如果它们满足条件(小于1mb并且是png / jpg / fig),则将文件附加到DOM 。我已将允许的fileSize设置为1MB。

for (var i = 0, f; f = files[i]; i++) {
        if (validateType(files[i].type)){
            //alert("ok");
            if (files[i].size < allowedSize){

        filesArray[i]=files[i];
        var reader = new FileReader();
        a = 0;
        reader.onload = function (event) {

            var image = new Image();
            image.src = event.target.result;
            //image.width = 100; // a fake resize
            imageBoxWrapper = $("<span />", {id: "idw"+a,class: "imageBoxWrapper"});
            imageBox = $("<span />", {id: "idb"+a,class: "imageBox"});

            complete = imageBox.append(image);
            $(complete).appendTo(imageBoxWrapper);

            newimageBox = $(imageBoxWrapper).append("<span class='imageDelete' imageIndex="+a+"><img src='images/icons/cross.png'> Delete</span>");

            $(newimageBox).appendTo("#dropZone");
            a++;
        };  

    reader.readAsDataURL(files[i]);
           } //end size validation
            else{
                oversize = true;
                overzsizefiles += files[i].name+" is bigger than 1Mb \n";
            }
    } // end type validation
    else{
        found = true;
        unAllowedFiles += files[i].name+" is not allowed \n";;
    } 
  }

当我删除大于1 MB的文件时,它们不会附加到DOM,但是当我在console.log(filesArray)时,长度适用于所有文件。 E.g

a.png > 1 MB
b.png > 512KB
c.png > 256KB

Alert will be thrown for a.png that it is oversize, 
b.png and c.png will be appended to DOM,
console.log(fileArray) outputs [1: file, 2; file]
console.log(fileArray) output 3

由于filesArray[i]=files[i]在if if (files[i].size < allowedSize)中声明,我原本期望数组长度为2

1 个答案:

答案 0 :(得分:1)

您正在执行filesArray[i]=files[i];因此,如果最后一项通过了尺寸测试,则filesArray将被设置为全长,即使未分配其中的某些项目。 Javascript .length报告的数据高于指定的最高数组元素。

在这个简单的测试中,您可以看到发生了什么:

var x = [];
x[10] = "foo";
alert(x.length);    // alerts 11

要修复它,您可能想要更改:

filesArray[i]=files[i];

到此:

filesArray.push(files[i]);

然后,filesArray只会包含通过尺寸测试的项目,其长度将与其中的项目数量相匹配。