013.【ID】別名同値の段落スタイルがあったらアラート
※未完成
書いたコード
var doc = app.activeDocument; var temp = doc.allParagraphStyles var pStyles = doc.allParagraphStyles.splice(2, temp.length - 2, ); // 基本段落と段落スタイルなしを除外 var combinations = []; var propertiesOfStyle1 = []; var propertiesOfStyle2 = []; var alertTxt = ""; // 全段落スタイルから2つ抜き出す組み合わせ配列を作成 var pCombinations = makeCombination(pStyles, 2); // 各段落スタイルのプロパティ(name以外)を比較 var pCombiLen = pCombinations.length; for (var i = 0; i < pCombiLen; i++) { var result = hasSameProps(pCombinations[i][0], pCombinations[i][1]); if (result === true) { alertTxt = alertTxt + pCombinations[i][0].name + "と" + pCombinations[i][1].name + "は同一です\n" } } // 結果表示 if (alertTxt != "") { alert(alertTxt) } // 2つの対象のプロパティを比較 function hasSameProps(obj1, obj2) { // name以外のプロパティを二次元配列として取得 var obj1Props = getProps(obj1, "name") var obj2Props = getProps(obj2, "name") var resultCompareProps = isSameArray(obj1Props, obj2Props) if (!resultCompareProps) { return false; } else { return true; } } // 2つの配列の中身を比較 function isSameArray(arr1, arr2) { if (Object.prototype.toString.call(arr1) !== "[object Array]") { //ExtendScriptではisArrayが使えない return false; } if (Object.prototype.toString.call(arr2) !== "[object Array]") { return false; } if (arr1.length !== arr2.length) { return false; } for (var i = 0; i < arr1.length; i++) { if (Object.prototype.toString.call(arr1[i]) == "[object Array]") { var flag = isSameArray(arr1[i], arr2[i]); } else { if (arr1[i] === arr2[i]) { var flag = true; } else { var flag = false; break; } } if (!flag) { return false; break; } } return true; } // プロパティを取得 第二引数で除外するプロパティを指定 // 多分ここがうまくいっていない? 全てのプロパティを取得できていない気がする function getProps(tgt, unnecessary) { var tgtProps = tgt.properties; var tgtPropsArr = []; for (var i in tgtProps) { tgtPropsArr.push([i, tgt[i]]) //ExtendScriptではkeysが使えない } // 不要な要素を削除 if (getProps.arguments.length == 2) { var tgtPropsArrLen = tgtPropsArr.length; // 256 なのにtgtPropsArrをデータブラウザで見ると19要素しかない for (var j = 0; j < tgtPropsArrLen; j++) { if (tgtPropsArr[j][0] === unnecessary) { delete tgtPropsArr[j] break; } } tgtPropsArr = deleteArrElement(tgtPropsArr, undefined); return tgtPropsArr; } } // 配列の要素の組み合わせ全パターンを作成 function makeCombination(tgt, num) { // tgt:取り出し元の配列 num:取り出す数 var arrs = []; var total = tgt.length; if (total < num) { // 対象となる配列の要素数より取り出す数が多かったら止める return; } else if (num === 1) { for (var i = 0; i < total; i++) { arrs[i] = [tgt[i]]; // 組み合わせ配列の各要素に配列として追加 } } else { for (var i = 0; i < total - num + 1; i++) { combinations = makeCombination(tgt.slice(i + 1), num - 1); // 残りの要素に対して繰り返す for (var j = 0; j < combinations.length; j++) { arrs.push([tgt[i]].concat(combinations[j])); } } } return arrs; } // 配列から指定した要素を削除 function deleteArrElement(arr, element) { var arrLen = arr.length; for (var i = 0; i < arrLen; i++) { if (arr[i] === element) { arr.splice(i, 1) break; } } return arr; }
メモ
知ったこと
- 順列と組み合わせ
- 順列:異なるn個からr個選んで一列に並べる。順番を考慮する。
- 組み合わせ:異なるn個からr個選ぶ。順番を考慮しない。
- ブラケット
- Obj[a] でオブジェクトのプロパティを定義
- [a] で配列を定義
- splice
配列から要素を削除する(対象の配列をを直接操作する)。
戻り値は「取り除かれた」要素。 - 配列
ExtendScriptで使えるメソッドは- Array.prototype.toString ( )
- Array.prototype.toLocaleString ( )
- Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
- Array.prototype.join (separator)
- Array.prototype.pop ( )
- Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
- Array.prototype.reverse ( )
- Array.prototype.shift ( )
- Array.prototype.slice (start, end)
- Array.prototype.sort (comparefn)
- Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
- Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
- delete
delete arr[i] とした場合、arr[i]はトルツメじゃなくトルママ。欠番になる。undefined。
積み残し
未完成。
おそらくgetProps関数がうまくいっていない。
データブラウザ上で確認すると、tgtPropsArrの中身が[19]までしかない。
i=filltint 以降(tgtPropsArr[20]以降)が配列に入ってきていない?
でもtgtPropsArrLenは256となっている。
参考
- 順列と組み合わせの違い・カンタンな見分け方を教えます! | Studyplus(スタディプラス)
- JavaScriptで順列、組合せ | You Look Too Cool
- InDesign用スクリプト配布ページ - 法規書籍印刷株式会社/情報システム部/情報デザイン課 (基準ドキュメントとの差分をとる.jsx)
- JavaScript で配列やオブジェクトなどが同じ内容か比較する - Qiita
- 【JavaScript】配列の比較を行う方法【equals相当/Array型の等価判定】 | MaryCore
- Adobe JavaScriptリファレンス
- JavaScript Tools Guide CC 1.0 documentation
- Ecma-262