ltdtDiff.mjs

import get from 'lodash-es/get.js'
import each from 'lodash-es/each.js'
import map from 'lodash-es/map.js'
import union from 'lodash-es/union.js'
import size from 'lodash-es/size.js'
import isarr from './isarr.mjs'
import isestr from './isestr.mjs'
import getltdtkeys from './getltdtkeys.mjs'
import ltdtkeys2mat from './ltdtkeys2mat.mjs'
import arrDiff from './arrDiff.mjs'


/**
 * 比對新舊物件陣列差異處
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/ltdtDiff.test.mjs Github}
 * @memberOf wsemi
 * @param {Array} ltdtOld 輸入原始數據物件陣列
 * @param {Array} ltdtNew 輸入更新數據物件陣列
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {String} [opt.dls='⟋'] 輸入若數據為矩陣時各儲存格分隔字串,預設'⟋'
 * @param {String} [opt.dlq='∶'] 輸入若數據為矩陣時各儲存格欄位指標分隔字串,預設'∶'
 * @param {String} [opt.empty='∗empty∗'] 輸入若無鍵值時給予之預設值,預設'∗empty∗'
 * @returns {Object} 回傳比對結果物件,回傳鍵值diff、dfrs與dfs,其中diff一樣為比對原始結果字串,dfrs為各列比對結果陣列,dfs為各儲存格比對結果陣列
 * @example
 *
 * let r
 * let ltdtOld
 * let ltdtNew
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'cn': '1', 'v1': 'a', 'v2': '0.506002098' },
 *         { 'cn': '2', 'v1': 'b', 'v2': '0.506002098' },
 *     ]
 *     ltdtNew = [
 *         { 'cn': 't1', 'v1': 'ta', 'v2': '0.506002098' },
 *         { 'cn': 't2', 'v1': 'tb', 'v2': '0.506002098' },
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   {
 *     //     count: 2,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶1⟋1∶a⟋2∶0.506002098⟋\n0∶2⟋1∶b⟋2∶0.506002098⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶t1⟋1∶ta⟋2∶0.506002098⟋\n0∶t2⟋1∶tb⟋2∶0.506002098⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df [
 *     //   { p: 'modify', k: 0, vo: '1', vn: 't1' },
 *     //   { p: 'modify', k: 1, vo: 'a', vn: 'ta' },
 *     //   { p: '', k: 2, vo: '0.506002098', vn: '' }
 *     // ]
 *     // 1 df [
 *     //   { p: 'modify', k: 0, vo: '2', vn: 't2' },
 *     //   { p: 'modify', k: 1, vo: 'b', vn: 'tb' },
 *     //   { p: '', k: 2, vo: '0.506002098', vn: '' }
 *     // ]
 * }
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'cn': '1', 'v1': '', 'v3': '0.506002098' },
 *     ]
 *     ltdtNew = [
 *         { 'cn': '1', 'v2': '', 'v3': '0.506002098' },
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   {
 *     //     count: 1,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶1⟋1∶⟋2∶0.506002098⟋3∶∗empty∗⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶1⟋1∶∗empty∗⟋2∶0.506002098⟋3∶⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df [
 *     //   { p: '', k: 'cn', vo: '1', vn: '' },
 *     //   { p: 'modify', k: 'v1', vo: '', vn: '∗empty∗' },
 *     //   { p: '', k: 'v3', vo: '0.506002098', vn: '' },
 *     //   { p: 'modify', k: 'v2', vo: '∗empty∗', vn: '' }
 *     // ]
 * }
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'hid': 'BH-01', 'sid': 'S-01', 'depth': '1-2', 'rsat': '18' },
 *         { 'hid': 'BH-01', 'sid': 'S-02', 'depth': '5-6', 'rsat': '17.5' },
 *         { 'hid': 'BH-01', 'sid': 'S-03', 'depth': '7-8', 'rsat': '17' },
 *     ]
 *     ltdtNew = [
 *         { 'hid': 'BH-01', 'sid': 'S-01', 'depth': '1-2', 'rsat': '18' },
 *         { 'hid': 'BH-01', 'sid': 'S-03', 'depth': '7-8', 'rsat': '17' },
 *         { 'hid': 'BH-01', 'sid': 'S-04', 'depth': '11-12', 'rsat': '19.5' },
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   { count: 1, value: '0∶BH-01⟋1∶S-01⟋2∶1-2⟋3∶18⟋\n' },
 *     //   {
 *     //     count: 1,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶BH-01⟋1∶S-02⟋2∶5-6⟋3∶17.5⟋\n'
 *     //   },
 *     //   { count: 1, value: '0∶BH-01⟋1∶S-03⟋2∶7-8⟋3∶17⟋\n' },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶BH-01⟋1∶S-04⟋2∶11-12⟋3∶19.5⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df {
 *     //   hid: { p: '', k: 'hid', vo: 'BH-01', vn: '' },
 *     //   sid: { p: '', k: 'sid', vo: 'S-01', vn: '' },
 *     //   depth: { p: '', k: 'depth', vo: '1-2', vn: '' },
 *     //   rsat: { p: '', k: 'rsat', vo: '18', vn: '' }
 *     // }
 *     // 1 df {
 *     //   hid: { p: 'remove', k: 'hid', vo: 'BH-01', vn: '' },
 *     //   sid: { p: 'remove', k: 'sid', vo: 'S-02', vn: '' },
 *     //   depth: { p: 'remove', k: 'depth', vo: '5-6', vn: '' },
 *     //   rsat: { p: 'remove', k: 'rsat', vo: '17.5', vn: '' }
 *     // }
 *     // 2 df {
 *     //   hid: { p: '', k: 'hid', vo: 'BH-01', vn: '' },
 *     //   sid: { p: '', k: 'sid', vo: 'S-03', vn: '' },
 *     //   depth: { p: '', k: 'depth', vo: '7-8', vn: '' },
 *     //   rsat: { p: '', k: 'rsat', vo: '17', vn: '' }
 *     // }
 *     // 3 df {
 *     //   hid: { p: 'add', k: 'hid', vo: 'BH-01', vn: '' },
 *     //   sid: { p: 'add', k: 'sid', vo: 'S-04', vn: '' },
 *     //   depth: { p: 'add', k: 'depth', vo: '11-12', vn: '' },
 *     //   rsat: { p: 'add', k: 'rsat', vo: '19.5', vn: '' }
 *     // }
 * }
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-1', 'depth': '0.9-1.2', 'unitWeight': 3.53, 'waterContent': 76.7, 'n': 7.672198498621583, 'Iv': 7.672198498621583 },
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-2', 'depth': '2.1-2.3', 'unitWeight': 3.83, 'waterContent': 91.3, 'n': 9.126731706783175, 'Iv': 9.126731706783175 },
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-3', 'depth': '4.4-4.6', 'unitWeight': 2.51, 'waterContent': 25.5, 'n': 2.552068908698857, 'Iv': 2.552068908698857 }
 *     ]
 *     ltdtNew = [
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-1A', 'depth': '0.9-1.2', 'unitWeight': 3.67, 'waterContent': 83.5, 'n': 8.347251752857119, 'Iv': 8.347251752857119 },
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-3', 'depth': '4.4-4.6', 'unitWeight': 2.51, 'waterContent': 25.5, 'n': 2.552068908698857, 'Iv': 2.552068908698857 },
 *         { 'testId': 'GeneralPhysicalProperties', 'holeId': 'BH-1', 'sampleId': 'S-4', 'depth': '5.1-5.3', 'unitWeight': 3.13, 'waterContent': 56.6, 'n': 5.655150997918099, 'Iv': 5.655150997918099 }
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   {
 *     //     count: 2,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶GeneralPhysicalProperties⟋1∶BH-1⟋2∶S-1⟋3∶0.9-1.2⟋4∶3.53⟋5∶76.7⟋6∶7.672198498621583⟋7∶7.672198498621583⟋\n' +
 *     //       '0∶GeneralPhysicalProperties⟋1∶BH-1⟋2∶S-2⟋3∶2.1-2.3⟋4∶3.83⟋5∶91.3⟋6∶9.126731706783175⟋7∶9.126731706783175⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶GeneralPhysicalProperties⟋1∶BH-1⟋2∶S-1A⟋3∶0.9-1.2⟋4∶3.67⟋5∶83.5⟋6∶8.347251752857119⟋7∶8.347251752857119⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     value: '0∶GeneralPhysicalProperties⟋1∶BH-1⟋2∶S-3⟋3∶4.4-4.6⟋4∶2.51⟋5∶25.5⟋6∶2.552068908698857⟋7∶2.552068908698857⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶GeneralPhysicalProperties⟋1∶BH-1⟋2∶S-4⟋3∶5.1-5.3⟋4∶3.13⟋5∶56.6⟋6∶5.655150997918099⟋7∶5.655150997918099⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df {
 *     //   testId: { p: '', k: 'testId', vo: 'GeneralPhysicalProperties', vn: '' },
 *     //   holeId: { p: '', k: 'holeId', vo: 'BH-1', vn: '' },
 *     //   sampleId: { p: 'modify', k: 'sampleId', vo: 'S-1', vn: 'S-1A' },
 *     //   depth: { p: '', k: 'depth', vo: '0.9-1.2', vn: '' },
 *     //   unitWeight: { p: 'modify', k: 'unitWeight', vo: '3.53', vn: '3.67' },
 *     //   waterContent: { p: 'modify', k: 'waterContent', vo: '76.7', vn: '83.5' },
 *     //   n: {
 *     //     p: 'modify',
 *     //     k: 'n',
 *     //     vo: '7.672198498621583',
 *     //     vn: '8.347251752857119'
 *     //   },
 *     //   Iv: {
 *     //     p: 'modify',
 *     //     k: 'Iv',
 *     //     vo: '7.672198498621583',
 *     //     vn: '8.347251752857119'
 *     //   }
 *     // }
 *     // 1 df {
 *     //   testId: { p: 'remove', k: 'testId', vo: 'GeneralPhysicalProperties', vn: '' },
 *     //   holeId: { p: 'remove', k: 'holeId', vo: 'BH-1', vn: '' },
 *     //   sampleId: { p: 'remove', k: 'sampleId', vo: 'S-2', vn: '' },
 *     //   depth: { p: 'remove', k: 'depth', vo: '2.1-2.3', vn: '' },
 *     //   unitWeight: { p: 'remove', k: 'unitWeight', vo: '3.83', vn: '' },
 *     //   waterContent: { p: 'remove', k: 'waterContent', vo: '91.3', vn: '' },
 *     //   n: { p: 'remove', k: 'n', vo: '9.126731706783175', vn: '' },
 *     //   Iv: { p: 'remove', k: 'Iv', vo: '9.126731706783175', vn: '' }
 *     // }
 *     // 2 df {
 *     //   testId: { p: '', k: 'testId', vo: 'GeneralPhysicalProperties', vn: '' },
 *     //   holeId: { p: '', k: 'holeId', vo: 'BH-1', vn: '' },
 *     //   sampleId: { p: '', k: 'sampleId', vo: 'S-3', vn: '' },
 *     //   depth: { p: '', k: 'depth', vo: '4.4-4.6', vn: '' },
 *     //   unitWeight: { p: '', k: 'unitWeight', vo: '2.51', vn: '' },
 *     //   waterContent: { p: '', k: 'waterContent', vo: '25.5', vn: '' },
 *     //   n: { p: '', k: 'n', vo: '2.552068908698857', vn: '' },
 *     //   Iv: { p: '', k: 'Iv', vo: '2.552068908698857', vn: '' }
 *     // }
 *     // 3 df {
 *     //   testId: { p: 'add', k: 'testId', vo: 'GeneralPhysicalProperties', vn: '' },
 *     //   holeId: { p: 'add', k: 'holeId', vo: 'BH-1', vn: '' },
 *     //   sampleId: { p: 'add', k: 'sampleId', vo: 'S-4', vn: '' },
 *     //   depth: { p: 'add', k: 'depth', vo: '5.1-5.3', vn: '' },
 *     //   unitWeight: { p: 'add', k: 'unitWeight', vo: '3.13', vn: '' },
 *     //   waterContent: { p: 'add', k: 'waterContent', vo: '56.6', vn: '' },
 *     //   n: { p: 'add', k: 'n', vo: '5.655150997918099', vn: '' },
 *     //   Iv: { p: 'add', k: 'Iv', vo: '5.655150997918099', vn: '' }
 *     // }
 * }
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'cn': '1', 'v1': '0.791303871', 'v2': '0.716898185', 'v3': '0.506002098', 'v4': '0.137888903', 'v5': '', 'v6': '0.626724085' },
 *         { 'cn': '2', 'v1': '0.839882385', 'v2': '0.663059856', 'v3': '0.49047221', 'v4': '0.395763265', 'v5': '0.567412025', 'v6': '0.866151835' },
 *         { 'cn': '3', 'v1': '0.475514539', 'v2': '0.969205779', 'v3': '0.711250309', 'v4': '0.153847069', 'v5': '0.304927473', 'v6': '0.410092395' },
 *         { 'cn': '4', 'v1': '0.486179086', 'v2': '0.481023842', 'v3': '0.467410582', 'v4': '0.42602231', 'v5': '', 'v6': '0.849701641' },
 *         { 'cn': '5', 'v1': '0.697242433', 'v2': '0.67532802', 'v3': '0.174644416', 'v4': '0.045652267', 'v5': '', 'v6': '0.397104668' },
 *         { 'cn': '6', 'v1': '0.259252779', 'v2': '0.566177431', 'v3': '0.679637706', 'v4': '0.377814487', 'v5': '', 'v6': '0.400248119' },
 *         { 'cn': '7', 'v1': '0.263793391', 'v2': '0.167895215', 'v3': '0.794808602', 'v4': '0.107070584', 'v5': '', 'v6': '0.011822872' },
 *         { 'cn': '8', 'v1': '0.360426795', 'v2': '0.014346373', 'v3': '0.000469616', 'v4': '0.4082693', 'v5': '', 'v6': '0.913806611' },
 *         { 'cn': '9', 'v1': '0.167996664', 'v2': '0.711054429', 'v3': '0.363177921', 'v4': '0.206849994', 'v5': '', 'v6': '0.636855344' },
 *         { 'cn': '10', 'v1': '0.324665077', 'v2': '0.973218005', 'v3': '0.883927423', 'v4': '0.176906125', 'v5': '', 'v6': '0.20087887' },
 *         { 'cn': '11', 'v1': '', 'v2': '', 'v3': '', 'v4': '', 'v5': '', 'v6': '' },
 *         { 'cn': '12', 'v1': '', 'v2': '', 'v3': '', 'v4': '', 'v5': '', 'v6': '' },
 *         { 'cn': '13', 'v1': '0.984003751', 'v2': '0.32549507', 'v3': '0.987090751', 'v4': '0.192745589', 'v5': '', 'v6': '0.735133561' },
 *         { 'cn': '14', 'v1': '0.083431884', 'v2': '0.565146092', 'v3': '0.935388666', 'v4': '0.637675154', 'v5': '', 'v6': '0.523815661' }
 *     ]
 *     ltdtNew = [
 *         { 'cn': '1', 'v1': '0.791303871', 'v2': '0.716898185', 'v3': '0.506002098', 'v4': '0.137888903', 'v5': '', 'v6': '0.626724085' },
 *         { 'cn': '2', 'v1': '0.839882385', 'v2': '0.663059856', 'v3': '0.49047221', 'v4': '0.395763265', 'v5': '', 'v6': '0.866151835' },
 *         { 'cn': '3', 'v1': '0.475514539', 'v2': '0.969205779', 'v3': '0.711250309', 'v4': '0.153847069', 'v5': '0.304927473', 'v6': '0.410092395' },
 *         { 'cn': '4', 'v1': '0.486179086', 'v2': '0.481023842', 'v3': '0.467410582', 'v4': '0.42602231', 'v5': '', 'v6': '0.849701641' },
 *         { 'cn': '5', 'v1': '0.169724243', 'v2': '0.67532802', 'v3': '0.174644416', 'v4': '0.045652267', 'v5': '', 'v6': '0.397104668' },
 *         { 'cn': '7', 'v1': '0.263793391', 'v2': '0.167895215', 'v3': '0.794808602', 'v4': '0.107070584', 'v5': '', 'v6': '0.011822872' },
 *         { 'cn': '8', 'v1': '0.360426795', 'v2': '0.014346373', 'v3': '0.000469616', 'v4': '0.4082693', 'v5': '', 'v6': '0.913806611' },
 *         { 'cn': '9', 'v1': '0.167996664', 'v2': '0.711054429', 'v3': '0.363173478', 'v4': '', 'v5': '0.729361837', 'v6': '0.636855344' },
 *         { 'cn': '10', 'v1': '0.324665077', 'v2': '0.973218005', 'v3': '0.883927423', 'v4': '0.176906125', 'v5': '0.397795245', 'v6': '0.20087887' },
 *         { 'cn': '13', 'v1': '0.984003751', 'v2': '0.32549507', 'v3': '0.987090751', 'v4': '0.192745589', 'v5': '', 'v6': '0.735133561' },
 *         { 'cn': '14', 'v1': '0.083431884', 'v2': '0.565146092', 'v3': '0.935388666', 'v4': '0.637675154', 'v5': '', 'v6': '0.523815661' },
 *         { 'cn': 'n1', 'v1': '0.89950443', 'v2': '0.182709318', 'v3': '0.892820757', 'v4': '0.709746901', 'v5': '', 'v6': '0.097385354' },
 *         { 'cn': 'n2', 'v1': '0.061355308', 'v2': '0.314826137', 'v3': '0.855857651', 'v4': '0.653550539', 'v5': '', 'v6': '0.772500773' },
 *         { 'cn': 'n3', 'v1': '0.085078711', 'v2': '0.844664253', 'v3': '0.21630142', 'v4': '0.912931341', 'v5': '', 'v6': '0.735138313' }
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   {
 *     //     count: 1,
 *     //     value: '0∶1⟋1∶0.791303871⟋2∶0.716898185⟋3∶0.506002098⟋4∶0.137888903⟋5∶⟋6∶0.626724085⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶2⟋1∶0.839882385⟋2∶0.663059856⟋3∶0.49047221⟋4∶0.395763265⟋5∶0.567412025⟋6∶0.866151835⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶2⟋1∶0.839882385⟋2∶0.663059856⟋3∶0.49047221⟋4∶0.395763265⟋5∶⟋6∶0.866151835⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     value: '0∶3⟋1∶0.475514539⟋2∶0.969205779⟋3∶0.711250309⟋4∶0.153847069⟋5∶0.304927473⟋6∶0.410092395⟋\n' +
 *     //       '0∶4⟋1∶0.486179086⟋2∶0.481023842⟋3∶0.467410582⟋4∶0.42602231⟋5∶⟋6∶0.849701641⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶5⟋1∶0.697242433⟋2∶0.67532802⟋3∶0.174644416⟋4∶0.045652267⟋5∶⟋6∶0.397104668⟋\n' +
 *     //       '0∶6⟋1∶0.259252779⟋2∶0.566177431⟋3∶0.679637706⟋4∶0.377814487⟋5∶⟋6∶0.400248119⟋\n'
 *     //   },
 *     //   {
 *     //     count: 1,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶5⟋1∶0.169724243⟋2∶0.67532802⟋3∶0.174644416⟋4∶0.045652267⟋5∶⟋6∶0.397104668⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     value: '0∶7⟋1∶0.263793391⟋2∶0.167895215⟋3∶0.794808602⟋4∶0.107070584⟋5∶⟋6∶0.011822872⟋\n' +
 *     //       '0∶8⟋1∶0.360426795⟋2∶0.014346373⟋3∶0.000469616⟋4∶0.4082693⟋5∶⟋6∶0.913806611⟋\n'
 *     //   },
 *     //   {
 *     //     count: 4,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶9⟋1∶0.167996664⟋2∶0.711054429⟋3∶0.363177921⟋4∶0.206849994⟋5∶⟋6∶0.636855344⟋\n' +
 *     //       '0∶10⟋1∶0.324665077⟋2∶0.973218005⟋3∶0.883927423⟋4∶0.176906125⟋5∶⟋6∶0.20087887⟋\n' +
 *     //       '0∶11⟋1∶⟋2∶⟋3∶⟋4∶⟋5∶⟋6∶⟋\n' +
 *     //       '0∶12⟋1∶⟋2∶⟋3∶⟋4∶⟋5∶⟋6∶⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶9⟋1∶0.167996664⟋2∶0.711054429⟋3∶0.363173478⟋4∶⟋5∶0.729361837⟋6∶0.636855344⟋\n' +
 *     //       '0∶10⟋1∶0.324665077⟋2∶0.973218005⟋3∶0.883927423⟋4∶0.176906125⟋5∶0.397795245⟋6∶0.20087887⟋\n'
 *     //   },
 *     //   {
 *     //     count: 2,
 *     //     value: '0∶13⟋1∶0.984003751⟋2∶0.32549507⟋3∶0.987090751⟋4∶0.192745589⟋5∶⟋6∶0.735133561⟋\n' +
 *     //       '0∶14⟋1∶0.083431884⟋2∶0.565146092⟋3∶0.935388666⟋4∶0.637675154⟋5∶⟋6∶0.523815661⟋\n'
 *     //   },
 *     //   {
 *     //     count: 3,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶n1⟋1∶0.89950443⟋2∶0.182709318⟋3∶0.892820757⟋4∶0.709746901⟋5∶⟋6∶0.097385354⟋\n' +
 *     //       '0∶n2⟋1∶0.061355308⟋2∶0.314826137⟋3∶0.855857651⟋4∶0.653550539⟋5∶⟋6∶0.772500773⟋\n' +
 *     //       '0∶n3⟋1∶0.085078711⟋2∶0.844664253⟋3∶0.21630142⟋4∶0.912931341⟋5∶⟋6∶0.735138313⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df {
 *     //   cn: { p: '', k: 'cn', vo: '1', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.791303871', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.716898185', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.506002098', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.137888903', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.626724085', vn: '' }
 *     // }
 *     // 1 df {
 *     //   cn: { p: '', k: 'cn', vo: '2', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.839882385', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.663059856', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.49047221', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.395763265', vn: '' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '0.567412025', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.866151835', vn: '' }
 *     // }
 *     // 2 df {
 *     //   cn: { p: '', k: 'cn', vo: '3', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.475514539', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.969205779', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.711250309', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.153847069', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '0.304927473', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.410092395', vn: '' }
 *     // }
 *     // 3 df {
 *     //   cn: { p: '', k: 'cn', vo: '4', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.486179086', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.481023842', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.467410582', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.42602231', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.849701641', vn: '' }
 *     // }
 *     // 4 df {
 *     //   cn: { p: '', k: 'cn', vo: '5', vn: '' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.697242433', vn: '0.169724243' },
 *     //   v2: { p: '', k: 'v2', vo: '0.67532802', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.174644416', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.045652267', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.397104668', vn: '' }
 *     // }
 *     // 5 df {
 *     //   cn: { p: 'remove', k: 'cn', vo: '6', vn: '' },
 *     //   v1: { p: 'remove', k: 'v1', vo: '0.259252779', vn: '' },
 *     //   v2: { p: 'remove', k: 'v2', vo: '0.566177431', vn: '' },
 *     //   v3: { p: 'remove', k: 'v3', vo: '0.679637706', vn: '' },
 *     //   v4: { p: 'remove', k: 'v4', vo: '0.377814487', vn: '' },
 *     //   v5: { p: 'remove', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'remove', k: 'v6', vo: '0.400248119', vn: '' }
 *     // }
 *     // 6 df {
 *     //   cn: { p: '', k: 'cn', vo: '7', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.263793391', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.167895215', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.794808602', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.107070584', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.011822872', vn: '' }
 *     // }
 *     // 7 df {
 *     //   cn: { p: '', k: 'cn', vo: '8', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.360426795', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.014346373', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.000469616', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.4082693', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.913806611', vn: '' }
 *     // }
 *     // 8 df {
 *     //   cn: { p: '', k: 'cn', vo: '9', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.167996664', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.711054429', vn: '' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.363177921', vn: '0.363173478' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.206849994', vn: '' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '', vn: '0.729361837' },
 *     //   v6: { p: '', k: 'v6', vo: '0.636855344', vn: '' }
 *     // }
 *     // 9 df {
 *     //   cn: { p: '', k: 'cn', vo: '10', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.324665077', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.973218005', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.883927423', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.176906125', vn: '' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '', vn: '0.397795245' },
 *     //   v6: { p: '', k: 'v6', vo: '0.20087887', vn: '' }
 *     // }
 *     // 10 df {
 *     //   cn: { p: 'remove', k: 'cn', vo: '11', vn: '' },
 *     //   v1: { p: 'remove', k: 'v1', vo: '', vn: '' },
 *     //   v2: { p: 'remove', k: 'v2', vo: '', vn: '' },
 *     //   v3: { p: 'remove', k: 'v3', vo: '', vn: '' },
 *     //   v4: { p: 'remove', k: 'v4', vo: '', vn: '' },
 *     //   v5: { p: 'remove', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'remove', k: 'v6', vo: '', vn: '' }
 *     // }
 *     // 11 df {
 *     //   cn: { p: 'remove', k: 'cn', vo: '12', vn: '' },
 *     //   v1: { p: 'remove', k: 'v1', vo: '', vn: '' },
 *     //   v2: { p: 'remove', k: 'v2', vo: '', vn: '' },
 *     //   v3: { p: 'remove', k: 'v3', vo: '', vn: '' },
 *     //   v4: { p: 'remove', k: 'v4', vo: '', vn: '' },
 *     //   v5: { p: 'remove', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'remove', k: 'v6', vo: '', vn: '' }
 *     // }
 *     // 12 df {
 *     //   cn: { p: '', k: 'cn', vo: '13', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.984003751', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.32549507', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.987090751', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.192745589', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.735133561', vn: '' }
 *     // }
 *     // 13 df {
 *     //   cn: { p: '', k: 'cn', vo: '14', vn: '' },
 *     //   v1: { p: '', k: 'v1', vo: '0.083431884', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.565146092', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.935388666', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.637675154', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.523815661', vn: '' }
 *     // }
 *     // 14 df {
 *     //   cn: { p: 'add', k: 'cn', vo: 'n1', vn: '' },
 *     //   v1: { p: 'add', k: 'v1', vo: '0.89950443', vn: '' },
 *     //   v2: { p: 'add', k: 'v2', vo: '0.182709318', vn: '' },
 *     //   v3: { p: 'add', k: 'v3', vo: '0.892820757', vn: '' },
 *     //   v4: { p: 'add', k: 'v4', vo: '0.709746901', vn: '' },
 *     //   v5: { p: 'add', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'add', k: 'v6', vo: '0.097385354', vn: '' }
 *     // }
 *     // 15 df {
 *     //   cn: { p: 'add', k: 'cn', vo: 'n2', vn: '' },
 *     //   v1: { p: 'add', k: 'v1', vo: '0.061355308', vn: '' },
 *     //   v2: { p: 'add', k: 'v2', vo: '0.314826137', vn: '' },
 *     //   v3: { p: 'add', k: 'v3', vo: '0.855857651', vn: '' },
 *     //   v4: { p: 'add', k: 'v4', vo: '0.653550539', vn: '' },
 *     //   v5: { p: 'add', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'add', k: 'v6', vo: '0.772500773', vn: '' }
 *     // }
 *     // 16 df {
 *     //   cn: { p: 'add', k: 'cn', vo: 'n3', vn: '' },
 *     //   v1: { p: 'add', k: 'v1', vo: '0.085078711', vn: '' },
 *     //   v2: { p: 'add', k: 'v2', vo: '0.844664253', vn: '' },
 *     //   v3: { p: 'add', k: 'v3', vo: '0.21630142', vn: '' },
 *     //   v4: { p: 'add', k: 'v4', vo: '0.912931341', vn: '' },
 *     //   v5: { p: 'add', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'add', k: 'v6', vo: '0.735138313', vn: '' }
 *     // }
 * }
 *
 * if (true) {
 *     ltdtOld = [
 *         { 'cn': '1', 'v8': '0.701731713', 'v1': '0.791303871', 'v2': '0.716898185', 'v3': '0.506002098', 'v4': '0.137888903', 'v5': '', 'v6': '0.626724085' },
 *         { 'cn': '2', 'v8': '0.944311349', 'v1': '0.839882385', 'v2': '0.663059856', 'v3': '0.49047221', 'v4': '0.395763265', 'v5': '0.567412025', 'v6': '0.866151835' },
 *         { 'cn': '3', 'v8': '0.516219732', 'v1': '0.475514539', 'v2': '0.969205779', 'v3': '0.711250309', 'v4': '0.153847069', 'v5': '0.304927473', 'v6': '0.410092395' },
 *         { 'cn': '4', 'v8': '0.454533809', 'v1': '0.486179086', 'v2': '0.481023842', 'v3': '0.467410582', 'v4': '0.42602231', 'v5': '', 'v6': '0.849701641' },
 *         { 'cn': '5', 'v8': '0.844099348', 'v1': '0.697242433', 'v2': '0.67532802', 'v3': '0.174644416', 'v4': '0.045652267', 'v5': '', 'v6': '0.397104668' },
 *         { 'cn': '6', 'v8': '0.15264562', 'v1': '0.259252779', 'v2': '0.566177431', 'v3': '0.679637706', 'v4': '0.377814487', 'v5': '', 'v6': '0.400248119' },
 *         { 'cn': '7', 'v8': '0.399132301', 'v1': '0.263793391', 'v2': '0.167895215', 'v3': '0.794808602', 'v4': '0.107070584', 'v5': '', 'v6': '0.011822872' },
 *         { 'cn': '8', 'v8': '', 'v1': '0.360426795', 'v2': '0.014346373', 'v3': '0.000469616', 'v4': '0.4082693', 'v5': '', 'v6': '0.913806611' },
 *         { 'cn': '9', 'v8': '', 'v1': '0.167996664', 'v2': '0.711054429', 'v3': '0.363177921', 'v4': '0.206849994', 'v5': '', 'v6': '0.636855344' },
 *         { 'cn': '10', 'v8': '', 'v1': '0.324665077', 'v2': '0.973218005', 'v3': '0.883927423', 'v4': '0.176906125', 'v5': '', 'v6': '0.20087887' },
 *         { 'cn': '11', 'v8': '', 'v1': '', 'v2': '', 'v3': '', 'v4': '', 'v5': '', 'v6': '' },
 *         { 'cn': '12', 'v8': '', 'v1': '', 'v2': '', 'v3': '', 'v4': '', 'v5': '', 'v6': '' },
 *         { 'cn': '13', 'v8': '', 'v1': '0.984003751', 'v2': '0.32549507', 'v3': '0.987090751', 'v4': '0.192745589', 'v5': '', 'v6': '0.735133561' },
 *         { 'cn': '14', 'v8': '', 'v1': '0.083431884', 'v2': '0.565146092', 'v3': '0.935388666', 'v4': '0.637675154', 'v5': '', 'v6': '0.523815661' }
 *     ]
 *     ltdtNew = [
 *         { 'cn': '1', 'v9': '', 'v1': '0.791303871', 'v2': '0.716898185', 'v3': '0.506002098', 'v4': '0.137888903', 'v5': '', 'v6': '0.626724085' },
 *         { 'cn': '2', 'v9': '', 'v1': '0.183988239', 'v2': '0.663059856', 'v3': '0.49047221', 'v4': '0.395763265', 'v5': '', 'v6': '0.866151835' },
 *         { 'cn': '3', 'v9': '', 'v1': '0.475514539', 'v2': '0.969205779', 'v3': '0.711250309', 'v4': '0.153847069', 'v5': '0.304927473', 'v6': '0.410092395' },
 *         { 'cn': '4', 'v9': '', 'v1': '0.486179086', 'v2': '0.481023842', 'v3': '0.467410582', 'v4': '0.42602231', 'v5': '', 'v6': '0.849701641' },
 *         { 'cn': '5', 'v9': '', 'v1': '0.697242433', 'v2': '0.67532802', 'v3': '0.174644416', 'v4': '0.045652267', 'v5': '', 'v6': '0.397104668' },
 *         { 'cn': '7', 'v9': '0.15264562', 'v1': '0.263793391', 'v2': '0.167895215', 'v3': '0.794808602', 'v4': '0.107070584', 'v5': '', 'v6': '0.011822872' },
 *         { 'cn': '8', 'v9': '0.399132301', 'v1': '0.360426795', 'v2': '0.014346373', 'v3': '0.000469616', 'v4': '0.4082693', 'v5': '', 'v6': '0.913806611' },
 *         { 'cn': '9', 'v9': '0.84324243', 'v1': '0.167996664', 'v2': '0.711054429', 'v3': '0.363173478', 'v4': '', 'v5': '0.729361837', 'v6': '0.636855344' },
 *         { 'cn': '10', 'v9': '0.631250305', 'v1': '0.324665077', 'v2': '0.973218005', 'v3': '0.883927423', 'v4': '0.176906125', 'v5': '0.397795245', 'v6': '0.20087887' },
 *         { 'cn': '13', 'v9': '0.980581906', 'v1': '0.984003751', 'v2': '0.32549507', 'v3': '0.987090751', 'v4': '0.192745589', 'v5': '', 'v6': '0.735133561' },
 *         { 'cn': '14', 'v9': '', 'v1': '0.083431884', 'v2': '0.565146092', 'v3': '0.935388666', 'v4': '0.637675154', 'v5': '', 'v6': '0.523815661' },
 *         { 'cn': 'n1', 'v9': '', 'v1': '0.89950443', 'v2': '0.182709318', 'v3': '0.892820757', 'v4': '0.709746901', 'v5': '', 'v6': '0.097385354' },
 *         { 'cn': 'n2', 'v9': '', 'v1': '0.061355308', 'v2': '0.314826137', 'v3': '0.855857651', 'v4': '0.653550539', 'v5': '', 'v6': '0.772500773' },
 *         { 'cn': 'n3', 'v9': '0.057840884', 'v1': '0.085078711', 'v2': '0.844664253', 'v3': '0.21630142', 'v4': '0.912931341', 'v5': '', 'v6': '0.735138313' }
 *     ]
 *     r = ltdtDiff(ltdtOld, ltdtNew)
 *     console.log('diff', r.diff)
 *     // => diff [
 *     //   {
 *     //     count: 14,
 *     //     added: undefined,
 *     //     removed: true,
 *     //     value: '0∶1⟋1∶0.701731713⟋2∶0.791303871⟋3∶0.716898185⟋4∶0.506002098⟋5∶0.137888903⟋6∶⟋7∶0.626724085⟋8∶∗empty∗⟋\n' +
 *     //       '0∶2⟋1∶0.944311349⟋2∶0.839882385⟋3∶0.663059856⟋4∶0.49047221⟋5∶0.395763265⟋6∶0.567412025⟋7∶0.866151835⟋8∶∗empty∗⟋\n' +
 *     //       '0∶3⟋1∶0.516219732⟋2∶0.475514539⟋3∶0.969205779⟋4∶0.711250309⟋5∶0.153847069⟋6∶0.304927473⟋7∶0.410092395⟋8∶∗empty∗⟋\n' +
 *     //       '0∶4⟋1∶0.454533809⟋2∶0.486179086⟋3∶0.481023842⟋4∶0.467410582⟋5∶0.42602231⟋6∶⟋7∶0.849701641⟋8∶∗empty∗⟋\n' +
 *     //       '0∶5⟋1∶0.844099348⟋2∶0.697242433⟋3∶0.67532802⟋4∶0.174644416⟋5∶0.045652267⟋6∶⟋7∶0.397104668⟋8∶∗empty∗⟋\n' +
 *     //       '0∶6⟋1∶0.15264562⟋2∶0.259252779⟋3∶0.566177431⟋4∶0.679637706⟋5∶0.377814487⟋6∶⟋7∶0.400248119⟋8∶∗empty∗⟋\n' +
 *     //       '0∶7⟋1∶0.399132301⟋2∶0.263793391⟋3∶0.167895215⟋4∶0.794808602⟋5∶0.107070584⟋6∶⟋7∶0.011822872⟋8∶∗empty∗⟋\n' +
 *     //       '0∶8⟋1∶⟋2∶0.360426795⟋3∶0.014346373⟋4∶0.000469616⟋5∶0.4082693⟋6∶⟋7∶0.913806611⟋8∶∗empty∗⟋\n' +
 *     //       '0∶9⟋1∶⟋2∶0.167996664⟋3∶0.711054429⟋4∶0.363177921⟋5∶0.206849994⟋6∶⟋7∶0.636855344⟋8∶∗empty∗⟋\n' +
 *     //       '0∶10⟋1∶⟋2∶0.324665077⟋3∶0.973218005⟋4∶0.883927423⟋5∶0.176906125⟋6∶⟋7∶0.20087887⟋8∶∗empty∗⟋\n' +
 *     //       '0∶11⟋1∶⟋2∶⟋3∶⟋4∶⟋5∶⟋6∶⟋7∶⟋8∶∗empty∗⟋\n' +
 *     //       '0∶12⟋1∶⟋2∶⟋3∶⟋4∶⟋5∶⟋6∶⟋7∶⟋8∶∗empty∗⟋\n' +
 *     //       '0∶13⟋1∶⟋2∶0.984003751⟋3∶0.32549507⟋4∶0.987090751⟋5∶0.192745589⟋6∶⟋7∶0.735133561⟋8∶∗empty∗⟋\n' +
 *     //       '0∶14⟋1∶⟋2∶0.083431884⟋3∶0.565146092⟋4∶0.935388666⟋5∶0.637675154⟋6∶⟋7∶0.523815661⟋8∶∗empty∗⟋\n'
 *     //   },
 *     //   {
 *     //     count: 14,
 *     //     added: true,
 *     //     removed: undefined,
 *     //     value: '0∶1⟋1∶∗empty∗⟋2∶0.791303871⟋3∶0.716898185⟋4∶0.506002098⟋5∶0.137888903⟋6∶⟋7∶0.626724085⟋8∶⟋\n' +
 *     //       '0∶2⟋1∶∗empty∗⟋2∶0.183988239⟋3∶0.663059856⟋4∶0.49047221⟋5∶0.395763265⟋6∶⟋7∶0.866151835⟋8∶⟋\n' +
 *     //       '0∶3⟋1∶∗empty∗⟋2∶0.475514539⟋3∶0.969205779⟋4∶0.711250309⟋5∶0.153847069⟋6∶0.304927473⟋7∶0.410092395⟋8∶⟋\n' +
 *     //       '0∶4⟋1∶∗empty∗⟋2∶0.486179086⟋3∶0.481023842⟋4∶0.467410582⟋5∶0.42602231⟋6∶⟋7∶0.849701641⟋8∶⟋\n' +
 *     //       '0∶5⟋1∶∗empty∗⟋2∶0.697242433⟋3∶0.67532802⟋4∶0.174644416⟋5∶0.045652267⟋6∶⟋7∶0.397104668⟋8∶⟋\n' +
 *     //       '0∶7⟋1∶∗empty∗⟋2∶0.263793391⟋3∶0.167895215⟋4∶0.794808602⟋5∶0.107070584⟋6∶⟋7∶0.011822872⟋8∶0.15264562⟋\n' +
 *     //       '0∶8⟋1∶∗empty∗⟋2∶0.360426795⟋3∶0.014346373⟋4∶0.000469616⟋5∶0.4082693⟋6∶⟋7∶0.913806611⟋8∶0.399132301⟋\n' +
 *     //       '0∶9⟋1∶∗empty∗⟋2∶0.167996664⟋3∶0.711054429⟋4∶0.363173478⟋5∶⟋6∶0.729361837⟋7∶0.636855344⟋8∶0.84324243⟋\n' +
 *     //       '0∶10⟋1∶∗empty∗⟋2∶0.324665077⟋3∶0.973218005⟋4∶0.883927423⟋5∶0.176906125⟋6∶0.397795245⟋7∶0.20087887⟋8∶0.631250305⟋\n' +
 *     //       '0∶13⟋1∶∗empty∗⟋2∶0.984003751⟋3∶0.32549507⟋4∶0.987090751⟋5∶0.192745589⟋6∶⟋7∶0.735133561⟋8∶0.980581906⟋\n' +
 *     //       '0∶14⟋1∶∗empty∗⟋2∶0.083431884⟋3∶0.565146092⟋4∶0.935388666⟋5∶0.637675154⟋6∶⟋7∶0.523815661⟋8∶⟋\n' +
 *     //       '0∶n1⟋1∶∗empty∗⟋2∶0.89950443⟋3∶0.182709318⟋4∶0.892820757⟋5∶0.709746901⟋6∶⟋7∶0.097385354⟋8∶⟋\n' +
 *     //       '0∶n2⟋1∶∗empty∗⟋2∶0.061355308⟋3∶0.314826137⟋4∶0.855857651⟋5∶0.653550539⟋6∶⟋7∶0.772500773⟋8∶⟋\n' +
 *     //       '0∶n3⟋1∶∗empty∗⟋2∶0.085078711⟋3∶0.844664253⟋4∶0.21630142⟋5∶0.912931341⟋6∶⟋7∶0.735138313⟋8∶0.057840884⟋\n'
 *     //   }
 *     // ]
 *     for (let i = 0; i < r.dfs.length; i++) {
 *         let df = r.dfs[i]
 *         console.log(i, 'df', df)
 *     }
 *     // => 0 df {
 *     //   cn: { p: '', k: 'cn', vo: '1', vn: '' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.701731713', vn: '∗empty∗' },
 *     //   v1: { p: '', k: 'v1', vo: '0.791303871', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.716898185', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.506002098', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.137888903', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.626724085', vn: '' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 1 df {
 *     //   cn: { p: '', k: 'cn', vo: '2', vn: '' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.944311349', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.839882385', vn: '0.183988239' },
 *     //   v2: { p: '', k: 'v2', vo: '0.663059856', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.49047221', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.395763265', vn: '' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '0.567412025', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.866151835', vn: '' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 2 df {
 *     //   cn: { p: '', k: 'cn', vo: '3', vn: '' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.516219732', vn: '∗empty∗' },
 *     //   v1: { p: '', k: 'v1', vo: '0.475514539', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.969205779', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.711250309', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.153847069', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '0.304927473', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.410092395', vn: '' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 3 df {
 *     //   cn: { p: '', k: 'cn', vo: '4', vn: '' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.454533809', vn: '∗empty∗' },
 *     //   v1: { p: '', k: 'v1', vo: '0.486179086', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.481023842', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.467410582', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.42602231', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.849701641', vn: '' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 4 df {
 *     //   cn: { p: '', k: 'cn', vo: '5', vn: '' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.844099348', vn: '∗empty∗' },
 *     //   v1: { p: '', k: 'v1', vo: '0.697242433', vn: '' },
 *     //   v2: { p: '', k: 'v2', vo: '0.67532802', vn: '' },
 *     //   v3: { p: '', k: 'v3', vo: '0.174644416', vn: '' },
 *     //   v4: { p: '', k: 'v4', vo: '0.045652267', vn: '' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: '', k: 'v6', vo: '0.397104668', vn: '' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 5 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '6', vn: '7' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.15264562', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.259252779', vn: '0.263793391' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.566177431', vn: '0.167895215' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.679637706', vn: '0.794808602' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.377814487', vn: '0.107070584' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.400248119', vn: '0.011822872' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.15264562' }
 *     // }
 *     // 6 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '7', vn: '8' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '0.399132301', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.263793391', vn: '0.360426795' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.167895215', vn: '0.014346373' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.794808602', vn: '0.000469616' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.107070584', vn: '0.4082693' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.011822872', vn: '0.913806611' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.399132301' }
 *     // }
 *     // 7 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '8', vn: '9' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.360426795', vn: '0.167996664' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.014346373', vn: '0.711054429' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.000469616', vn: '0.363173478' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.4082693', vn: '' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '', vn: '0.729361837' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.913806611', vn: '0.636855344' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.84324243' }
 *     // }
 *     // 8 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '9', vn: '10' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.167996664', vn: '0.324665077' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.711054429', vn: '0.973218005' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.363177921', vn: '0.883927423' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.206849994', vn: '0.176906125' },
 *     //   v5: { p: 'modify', k: 'v5', vo: '', vn: '0.397795245' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.636855344', vn: '0.20087887' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.631250305' }
 *     // }
 *     // 9 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '10', vn: '13' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.324665077', vn: '0.984003751' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.973218005', vn: '0.32549507' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.883927423', vn: '0.987090751' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.176906125', vn: '0.192745589' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.20087887', vn: '0.735133561' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.980581906' }
 *     // }
 *     // 10 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '11', vn: '14' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '', vn: '0.083431884' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '', vn: '0.565146092' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '', vn: '0.935388666' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '', vn: '0.637675154' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '', vn: '0.523815661' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 11 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '12', vn: 'n1' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '', vn: '0.89950443' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '', vn: '0.182709318' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '', vn: '0.892820757' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '', vn: '0.709746901' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '', vn: '0.097385354' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 12 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '13', vn: 'n2' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.984003751', vn: '0.061355308' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.32549507', vn: '0.314826137' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.987090751', vn: '0.855857651' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.192745589', vn: '0.653550539' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.735133561', vn: '0.772500773' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '' }
 *     // }
 *     // 13 df {
 *     //   cn: { p: 'modify', k: 'cn', vo: '14', vn: 'n3' },
 *     //   v8: { p: 'modify', k: 'v8', vo: '', vn: '∗empty∗' },
 *     //   v1: { p: 'modify', k: 'v1', vo: '0.083431884', vn: '0.085078711' },
 *     //   v2: { p: 'modify', k: 'v2', vo: '0.565146092', vn: '0.844664253' },
 *     //   v3: { p: 'modify', k: 'v3', vo: '0.935388666', vn: '0.21630142' },
 *     //   v4: { p: 'modify', k: 'v4', vo: '0.637675154', vn: '0.912931341' },
 *     //   v5: { p: '', k: 'v5', vo: '', vn: '' },
 *     //   v6: { p: 'modify', k: 'v6', vo: '0.523815661', vn: '0.735138313' },
 *     //   v9: { p: 'modify', k: 'v9', vo: '∗empty∗', vn: '0.057840884' }
 *     // }
 * }
 *
 */
function ltdtDiff(ltdtOld, ltdtNew, opt = {}) {

    //check
    if (!isarr(ltdtOld)) {
        return {}
    }
    if (!isarr(ltdtNew)) {
        return {}
    }
    if (size(ltdtOld) === 0 && size(ltdtNew) === 0) {
        return {}
    }

    //empty
    let empty = get(opt, 'empty')
    if (!isestr(empty)) {
        empty = '∗empty∗'
    }

    //keysOld, keysNew
    let keysOld = getltdtkeys(ltdtOld)
    let keysNew = getltdtkeys(ltdtNew)

    //keys
    let keys = union(keysOld, keysNew)
    // console.log('keys', keys)

    //kp
    let kp = {}
    each(keys, (key, k) => {
        kp[k] = key
    })

    //matOld, matNew
    let matOld = ltdtkeys2mat(ltdtOld, keys, { empty })
    let matNew = ltdtkeys2mat(ltdtNew, keys, { empty })

    //arrDiff
    let r = arrDiff(matOld, matNew, { ...opt, mode: 'matrix' })

    r.dfs = map(r.dfs, (r) => {

        //轉換指標k為欄位鍵key
        let rt = {}
        each(r, (c) => {
            c.k = kp[c.k]
            rt[c.k] = c
        })
        // console.log('rt', rt)

        //sort keys
        let ro = {}
        each(keys, (key) => {
            ro[key] = rt[key]
        })
        // console.log('ro', ro)

        return ro
    })

    return r
}


export default ltdtDiff