赤字:JavaScriptの命令や重要なタグ/青字:用途に応じて変更する部分/緑字:変更可能な変数名やユーザー関数名
配列変数の中から一部のデータを抹消して配列を切り詰める方法を紹介します。
folderObj = Folder.selectDialog("フォルダを選択してください。"); //ファイルダイアログを開く (*1)
if (folderObj) {
fileList = folderObj.getFiles("*.psd"); //ファイルを取得 (*2)
//特定のファイル名を除去
for (n=fileList.length; n>0; n--) { //配列を後方から処理 (*3)
if (fileList[n-1].name.indexOf("._") == 0) { //ファイル名を調査 (*4)
fileList.splice(n-1,1); //配列の削除(*5)
}
}
}
例文のスクリプトは、Photoshopにてスクリプトによる自動処理をするために作成したもので、その抜粋となります。
Photoshopのスクリプトは、JavaScriptをベースにしており、ファイルの読み書きも可能になっています。
このスクリプトの目的は、フォルダを選択して、その中にあるPSDファイルをリストとして取得します。
スクリプトをWindowsで動作させたとき、MacOS上での隠しファイル(ファイル名の先頭が「._」で始まる)がリストに含まれてしまいます。しかし、それらはPSDファイルではないため、この後に続く処理の対象から除去する必要があります。
スクリプト内では、ファイル名は配列変数fileListに格納されているため、対象のファイル名が入っている配列のデータを配列ごと除去します。
(*1)処理するフォルダを選択(folderObjを取得)
(*2)フォルダ内にあるファイルのパスを配列変数fileListに取得(この場合はnew Arrayが不要)
(*3)配列変数fileListを後ろから処理します
(*4)ファイル名の先頭に「._」が含まれるものを検知
(*5)配列変数fileListのインデックス(管理番号)「n-1」番から1つの配列を抹消
配列の抹消処理は、(*3)~(*5)の部分を参考にしてください。
for文で配列を後方から処理することが重要です。配列の抹消をすると影響が配列の後方に生じるため、影響を回避しながら処理をすることができます。
(*5)で、配列が1つ抹消されると、配列の要素数(fileList.length)が1つ減ります。抹消された配列の位置から後方にあるデータが全て1つずつ前のインデックスにずれるのです。
前方からfor文で処理をした場合の問題点も考えておきましょう。
folderObj = Folder.selectDialog("フォルダを選択してください。"); //ファイルダイアログを開く (*1)
if (folderObj) {
fileList = folderObj.getFiles("*.psd"); //ファイルを取得 (*2)
//特定のファイル名を除去
for (n=0; n<fileList.length; n++) { //配列を前方から処理 (*3)
if (fileList[n].name.indexOf("._") == 0) { //ファイル名を調査 (*4)
fileList.splice(n,1); //配列の削除(*5)
}
}
}
(*3)〜(*5)の部分は上記のように変更となります。
(*5)で配列が1つ抹消されると、この時点で配列の順番が1つ前にずれています。
次の(*4)で新たに配列のチェックをしますが、本来次にチェックするデータは削除された配列の位置にあるため、1つデータを飛ばして処理してしまいます。
もし、配列を前から処理する場合は、問題のないデータを選別し、別の新しい配列変数に入れ直すのがいいでしょう。