// FormsParams
// WebAppレイヤ(レイヤー固有UI)のフォームの設定値をキャプチャし、再現可能にする
// レジューム機能やパーマリンク機能をさらに高機能なものにすること、高度なオートパイロットを実現することなどを想定した機能


// https://www.google.com/search?q=javascript+longest+common+substring
// https://stackoverflow.com/questions/47884388/how-to-get-longest-substring-from-array-of-strings-using-javascript
//https://www.geeksforgeeks.org/longest-common-substring-dp-29/

function commonSubsequence(array){
    let sortedArray = array.sort(); 
    let first = sortedArray[0];
    let last = sortedArray.pop();
    let length = first.length;
    let index = 0;
    
    while(index<length && first[index] === last[index])
        index++;
    return first.substring(0, index);
}
console.log(commonSubsequence(["logerror", "log:today", "log:1"]));
console.log(commonSubsequence(["dog+ěě+", "dog15qwqqq", "dogggggg"]));



^^^^^^^




function LCSubStr( X,  Y , m , n) {
        // Create a table to store
        // lengths of longest common
        // suffixes of substrings.
        // Note that LCSuff[i][j]
        // contains length of longest
        // common suffix of
        // X[0..i-1] and Y[0..j-1].
        // The first row and first
        // column entries have no
        // logical meaning, they are
        // used only for simplicity of program
         
        var LCStuff =
        Array(m + 1).fill().map(()=>Array(n + 1).fill(0));
 
        // To store length of the longest
        // common substring
        var result = 0;
 
        // Following steps build
        // LCSuff[m+1][n+1] in bottom up fashion
        for (i = 0; i <= m; i++) {
            for (j = 0; j <= n; j++) {
                if (i == 0 || j == 0)
                    LCStuff[i][j] = 0;
                else if (X[i - 1] == Y[j - 1]) {
                    LCStuff[i][j] = LCStuff[i - 1][j - 1] + 1;
                    result = Math.max(result, LCStuff[i][j]);
                } else
                    LCStuff[i][j] = 0;
            }
        }
        return result;
    }
 
    // Driver Code
     
        var X = "OldSite:GeeksforGeeks.org";
        var Y = "NewSite:GeeksQuiz.com";
 
        var m = X.length;
        var n = Y.length;
 
        document.write("Length of Longest Common Substring is " +
        LCSubStr(X, Y, m, n));
 
// This code contributed by Rajput-Ji
 
 
 https://stackoverflow.com/questions/47884388/how-to-get-longest-substring-from-array-of-strings-using-javascript
 
 var lcs = function (n, m) {
    let lcs = 0 //to store longest common substring
    let s1 = n.length
    let s2 = m.length
    
    var sp=0;

    for(let i = 0;i < s1;i++){
        for(let j = 0; j< s2;j++){
            let track = 0
            var ssp = j
            //if letter are same, do while to check next letter
            if(n[i] == m[j]){
                while(i + track < s1 && j + track < s2 && n[i + track] == m[j + track]){
                    track += 1 // to track
                    if (lcs < track) {
                        lcs += 1
                        sp = ssp;
                    }
                }
            }
        }
    }
   console.log(sp,lcs, m.substring(sp,sp+lcs));
    return lcs;
};



2023.8.30
レイヤーON初期の状態を記録し、それに対してのdifを得るようにすればオブジェクトサイズが小さくなるかも
レイヤONしててもLayerUIがONになってないケースがあるので、レイヤUIが起動した直を取キャプチャする必要がある
LayerUI ONで処理が落ち着いたことをチェックするのには"zoomPanMapCompleted"イベントを使う

difは、customLayerMaagerが参考になるかもだが、もっと純粋なもので良いようにも思う。ただ構造限定の最小化がありそう
https://zenn.dev/fizumi/scraps/a663605958d0ce
https://github.com/flitbit/diff
https://github.com/cosmicanant/recursive-diff

レイヤON直後
ifp = fp.getVisibleLayersFormsParams();
いろいろ設定後
pfp = fp.getVisibleLayersFormsParams();

df0 = DeepDiff.diff(ifp,pfp) > flitbit/diff
df1 = recursiveDiff.getDiff(ifp,pfp) // こっちのほうが良いかも > recursive-diff
こんなデータになる
公共施設(サブレイヤ有)
[
	{"op":"update","path":["公共施設(サブレイヤ有)",47,"checked"],"val":false},
	{"op":"update","path":["公共施設(サブレイヤ有)",48,"checked"],"val":true},
	{"op":"update","path":["公共施設(サブレイヤ有)",49,"checked"],"val":true},
	{"op":"update","path":["公共施設(サブレイヤ有)",50,"checked"],"val":true}
]

とか
J-RISQ地震速報(防災科研)
[
	{"op":"update","path":["J-RISQ地震速報(防災科研)",1,"value"],"val":"2011"},
	{"op":"update","path":["J-RISQ地震速報(防災科研)",1,"selectedIndex"],"val":12},
	{"op":"update","path":["J-RISQ地震速報(防災科研)",2,"value"],"val":"2"},
	{"op":"update","path":["J-RISQ地震速報(防災科研)",2,"selectedIndex"],"val":2},
	{"op":"update","path":["J-RISQ地震速報(防災科研)",4,"value"],"val":"20110311144626,0001,00001"},
	{"op":"update","path":["J-RISQ地震速報(防災科研)",4,"selectedIndex"],"val":84}
]