InDesignのJavascriptには、everyItem()という謎なメソッドが存在する。API説明を見てみると:Returns every object(単数) in the collection
例:
TextFrames.everyItem(): Returns every TextFrame in the collection.
Cells.everyItem(): Returns every Cell in the collection.
要すると:objects(複数).everyItem()-->object(単数)のlist/collectionが返ってくる。そのlistがメモリの中に格納され、後でobjectの属性を取得する時、爆速!
2つの例(昔実際に発生した案件中の一部の処理)で、どのぐらい早くなるかを検証してみる。
例1:文字塗りに使っていけない色が存在するか。仮にDIC 582sを例に
//textFrame内の文字には、「DIC 582s」という特色を使っているかをチェック var tf = app.selection[0]; var characters = tf.characters; var len = characters.length; var curChar; //通常loopの場合 var start = new Date(); for (var c = 0; c < 100; c++) {//100回Loop for (var i = 0; i < len; i++) { curChar = characters[i]; if (curChar.fillColor.name === "DIC 582s") { // $.writeln(curChar.contents); } } } $.writeln((new Date() - start) / 1000);//8秒程度 // //everyItem()メソッドを使う場合 var start = new Date(); var fillColors = characters.everyItem().fillColor;//list[[object Color],...] for (var c = 0; c < 100; c++) {//100回Loop for (var i = 0; i < len; i++) { if (fillColors[i].name === "DIC 582s") { // $.writeln(characters[i].contents); } } } $.writeln((new Date() - start) / 1000);//0.4秒程度
8秒-->0.4秒:20倍程度早くなる
※因みに、InDesign 2021には、色を検索する機能が搭載されました。
例2:表組から、セルの線幅が0.2mmのセルを探す
//通常loopの場合 var start = new Date(); for (var c = 0; c < 10; c++) {//10回Loop for (var i = 0; i < len; i++) { cell = cells[i]; top = cell.topEdgeStrokeWeight; bottom = cell.bottomEdgeStrokeWeight; left = cell.leftEdgeStrokeWeight; right = cell.rightEdgeStrokeWeight; if (parseInt(top * 10) === 2 || parseInt(bottom * 10) === 2 || parseInt(left * 10) === 2 || parseInt(right * 10) === 2) { // $.writeln(i + 1); } } } $.writeln((new Date() - start) / 1000);//5.5秒程度 //everyItem()メソッドを使う場合 var start = new Date(); var tmp = cells.everyItem(); var tops = tmp.topEdgeStrokeWeight;//list var bottoms = tmp.bottomEdgeStrokeWeight; var lefts = tmp.leftEdgeStrokeWeight; var rights = tmp.rightEdgeStrokeWeight; for (var c = 0; c < 10; c++) {//10回Loop for (var i = 0; i < len; i++) { if (parseInt(tops[i] * 10) === 2 || parseInt(bottoms[i] * 10) === 2 || parseInt(lefts[i] * 10) === 2 || parseInt(rights[i] * 10) === 2) { // $.writeln(i + 1); } } } $.writeln((new Date() - start) / 1000);//0.13秒程度
5.5秒-->0.13秒:40倍程度早くなる