7962


現在は下記のような実装になっており、elseに入ったらその時点のfile[i]を削除したいのですが方法が分かりません。ご教授をお願いします。

[code]

    var files = e.target.files || e.dataTransfer.files;
    
            for (var i = 0; i < files.length;i++){
                if (files[i].type == 'video/3gpp' || files[i].type == 'video/3gpp2' ||
                files[i].type == 'audio/vnd.dlna.adts' || files[i].type == 'video/avi' ||
                files[i].type == 'video/vnd.dlna.mpeg-tts' || files[i].type == 'audio/x-m4a' ||
                files[i].type == 'audio/x-m4b' || files[i].type == 'audio/x-m4p' ||
                files[i].type == 'video/quicktime' || files[i].type == 'video/mp4' ||
                files[i].type == 'audio/wav' || files[i].type == 'video/x-matroska' ||
                files[i].type == 'audio/x-matroska' || files[i].type == 'audio/mp3') {
                    alert(files[i].type + 'ファイルが選択されました');
                }
                else {
                    alert(files[i].type + '不正なファイル形式です');
                   }
            }
    
[/code]


CC BY-SA 3.0
2015-03-16T03:04:53.930
7957
2015-03-17T08:45:34.460
7626
question
javascript html5
javascriptのFileListから、指定要素を削除したいです


`splice()`を使えば削除できます。

[code]

    if(...){
        // 省略
    }else{
        files.splice(i, 1);
    }
    
[/code]

**追記：**  
0からの要素アクセスでは`splice`した際に正しい位置を保持できないため、逆からのアクセスに修正。

[code]

        var files = [
            {"type" : "aaa"},
            {"type" : "bbb"},
            {"type" : "ccc"},
            {"type" : "ddd"},
            {"type" : "eee"}
        ];
        
        for(var i = files.length-1; i >= 0; i--){
            if(i==0 || i==2 || i==4){
                // 配列要素の削除
                files.splice(i,1);
            }
        }
        
        for(var i = 0; i < files.length; i++){
            $('#target').append(files[i].type+'<br />');
        }
[/code]

[code]

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    
    <div id="target"></div>
[/code]


CC BY-SA 3.0
2015-03-16T04:03:38.480
7961
2015-03-17T08:45:34.460
2015-03-17T08:45:34.460
7214
7214
7957
answer


結果を保存する配列を用意して、そこに必要な物だけ保存するのはどうでしょうか？  
説明のためにファイルの配列ではなく単なる文字列の配列で書いてみました。  
また条件判断もスッキリ書けるように書きなおしました。

[code]

    files = ['video/3gpp', 'audio/x-m4b', 'other'];
    accepted_file_types = [
        'video/3gpp','video/3gpp2','audio/vnd.dlna.adts', 'video/avi', 'audio/x-m4b'
    ];
    filtered_files = [];
    for (var i = 0; i < files.length; i++){
        if(accepted_file_types.indexOf(files[i]) >= 0){
            filtered_files.push(files[i]);
        }
    }
    
[/code]


CC BY-SA 3.0
2015-03-16T04:19:16.330
7962
2015-03-16T04:19:16.330
3271
7957
answer


配列の中から、条件に合ったものだけを抽出するには、  
Array.prototype.filter関数が使えます。

[code]

    // すべてのファイル
    var files = [
      {file_name: "testA", type: "a"},
      {file_name: "testB", type: "b"},
      {file_name: "testC", type: "c"},
      {file_name: "testD", type: "d"},
      {file_name: "testE", type: "a"},
      {file_name: "testF", type: "b"},
    ];
    
    // 許可するファイルタイプ
    var accepted_types = ["a", "c"];
    
    // フィルタリング
    var filtered_files = files.filter(function(file){
      return accepted_types.indexOf(file.type) >= 0;
      });
    
    // 結果表示
    document.querySelector('body').innerHTML=JSON.stringify(filtered_files);
[/code]


CC BY-SA 3.0
2015-03-17T04:56:12.273
8003
2015-03-17T04:56:12.273
8305
7957
answer