convertToTree.mjs

import get from 'lodash-es/get.js'
import isestr from './isestr.mjs'
import iseobj from './iseobj.mjs'
import isearr from './isearr.mjs'
import isbol from './isbol.mjs'
import flattenToConn from './flattenToConn.mjs'
import composeToTree from './composeToTree.mjs'


/**
 * 展開物件或陣列成為樹狀陣列
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/convertToTree.test.mjs Github}
 * @memberOf wsemi
 * @param {Array|Object} data 輸入項目物件或陣列
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {String} [bindKey='id'] 輸入識別用欄位字串,預設'id'
 * @param {String} [bindParent='parentId'] 輸入存放父節點欄位字串,預設'parentId'
 * @param {String} [bindText='value'] 輸入存放值欄位字串,預設'value'
 * @param {String} [bindChildren='children'] 輸入產生樹狀物件時,各節點內存放子節點欄位字串,預設'children'
 * @param {String} [bindType='type'] 輸入存放值種類欄位字串,預設'type'
 * @param {String} [bindNumOfChilren='numOfChilren'] 輸入存放值為物件或陣列時所屬子節點數量欄位字串,預設'numOfChilren'
 * @param {String} [bindRoot='root'] 輸入若為物件時,自動給予根節點鍵值字串,預設'root'
 * @param {Boolean} [saveExtProps=false] 輸入是否儲存項目物件從屬資訊布林值,預設false
 * @returns {Array} 回傳樹狀陣列
 * @example
 *
 * let r
 *
 * let obj = {
 *     a: 1,
 *     b: 12.3,
 *     c: 'abc',
 *     d: '45-de',
 *     x: true,
 *     y: null,
 *     z: function() {},
 *     e: [],
 *     f: [
 *         91,
 *         912.3,
 *         'abc',
 *         '945-de',
 *         true,
 *         null,
 *         function() {},
 *         [
 *             5,
 *             54.3,
 *             'xyz',
 *         ]
 *     ],
 *     g: {},
 *     h: {
 *         ga: 81,
 *         gb: 812.3,
 *         gc: 'abc',
 *         gd: '845-de',
 *         ge: [
 *             71,
 *             712.3,
 *             'abc',
 *             '745-de',
 *             true,
 *             null,
 *             function() {},
 *         ],
 *         gf: {
 *             gfa: 61,
 *             gfb: 612.3,
 *             gfc: 'abc',
 *             gfd: '645-de',
 *             gfe: true,
 *             gff: null,
 *             gfg: function() {},
 *         },
 *         gx: true,
 *         gy: null,
 *         gz: function() {},
 *     },
 *     i: Symbol('foo'),
 *     [Symbol('i-sym-key-a')]: 'i-sym-value',
 *     [Symbol('i-sym-key-b')]: {
 *         symfa: 61,
 *         symfb: 612.3,
 *         symfc: 'abc',
 *         symfd: '645-de',
 *         symfe: true,
 *         symff: null,
 *         symfg: function() {},
 *     },
 * }
 * r = convertToTree(obj)
 * console.log('convertToTree obj', JSON.stringify(r, null, 2))
 * // => convertToTree obj [
 * //   {
 * //     "id": "root",
 * //     "parentId": "",
 * //     "type": "object",
 * //     "key": "root",
 * //     "numOfChilren": 12,
 * //     "children": [
 * //       {
 * //         "id": "root-a",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "a",
 * //         "text": 1
 * //       },
 * //       {
 * //         "id": "root-b",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "b",
 * //         "text": 12.3
 * //       },
 * //       {
 * //         "id": "root-c",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "c",
 * //         "text": "abc"
 * //       },
 * //       {
 * //         "id": "root-d",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "d",
 * //         "text": "45-de"
 * //       },
 * //       {
 * //         "id": "root-x",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "x",
 * //         "text": true
 * //       },
 * //       {
 * //         "id": "root-y",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "y",
 * //         "text": null
 * //       },
 * //       {
 * //         "id": "root-z",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "z"
 * //       },
 * //       {
 * //         "id": "root-e",
 * //         "parentId": "root",
 * //         "type": "array",
 * //         "key": "e",
 * //         "numOfChilren": 0
 * //       },
 * //       {
 * //         "id": "root-f",
 * //         "parentId": "root",
 * //         "type": "array",
 * //         "key": "f",
 * //         "numOfChilren": 8,
 * //         "children": [
 * //           {
 * //             "id": "root-f-0",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 0,
 * //             "text": 91
 * //           },
 * //           {
 * //             "id": "root-f-1",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 1,
 * //             "text": 912.3
 * //           },
 * //           {
 * //             "id": "root-f-2",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 2,
 * //             "text": "abc"
 * //           },
 * //           {
 * //             "id": "root-f-3",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 3,
 * //             "text": "945-de"
 * //           },
 * //           {
 * //             "id": "root-f-4",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 4,
 * //             "text": true
 * //           },
 * //           {
 * //             "id": "root-f-5",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 5,
 * //             "text": null
 * //           },
 * //           {
 * //             "id": "root-f-6",
 * //             "parentId": "root-f",
 * //             "type": "node",
 * //             "key": 6
 * //           },
 * //           {
 * //             "id": "root-f-7",
 * //             "parentId": "root-f",
 * //             "type": "array",
 * //             "key": 7,
 * //             "numOfChilren": 3,
 * //             "children": [
 * //               {
 * //                 "id": "root-f-7-0",
 * //                 "parentId": "root-f-7",
 * //                 "type": "node",
 * //                 "key": 0,
 * //                 "text": 5
 * //               },
 * //               {
 * //                 "id": "root-f-7-1",
 * //                 "parentId": "root-f-7",
 * //                 "type": "node",
 * //                 "key": 1,
 * //                 "text": 54.3
 * //               },
 * //               {
 * //                 "id": "root-f-7-2",
 * //                 "parentId": "root-f-7",
 * //                 "type": "node",
 * //                 "key": 2,
 * //                 "text": "xyz"
 * //               }
 * //             ]
 * //           }
 * //         ]
 * //       },
 * //       {
 * //         "id": "root-g",
 * //         "parentId": "root",
 * //         "type": "object",
 * //         "key": "g",
 * //         "numOfChilren": 0
 * //       },
 * //       {
 * //         "id": "root-h",
 * //         "parentId": "root",
 * //         "type": "object",
 * //         "key": "h",
 * //         "numOfChilren": 9,
 * //         "children": [
 * //           {
 * //             "id": "root-h-ga",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "ga",
 * //             "text": 81
 * //           },
 * //           {
 * //             "id": "root-h-gb",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gb",
 * //             "text": 812.3
 * //           },
 * //           {
 * //             "id": "root-h-gc",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gc",
 * //             "text": "abc"
 * //           },
 * //           {
 * //             "id": "root-h-gd",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gd",
 * //             "text": "845-de"
 * //           },
 * //           {
 * //             "id": "root-h-ge",
 * //             "parentId": "root-h",
 * //             "type": "array",
 * //             "key": "ge",
 * //             "numOfChilren": 7,
 * //             "children": [
 * //               {
 * //                 "id": "root-h-ge-0",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 0,
 * //                 "text": 71
 * //               },
 * //               {
 * //                 "id": "root-h-ge-1",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 1,
 * //                 "text": 712.3
 * //               },
 * //               {
 * //                 "id": "root-h-ge-2",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 2,
 * //                 "text": "abc"
 * //               },
 * //               {
 * //                 "id": "root-h-ge-3",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 3,
 * //                 "text": "745-de"
 * //               },
 * //               {
 * //                 "id": "root-h-ge-4",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 4,
 * //                 "text": true
 * //               },
 * //               {
 * //                 "id": "root-h-ge-5",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 5,
 * //                 "text": null
 * //               },
 * //               {
 * //                 "id": "root-h-ge-6",
 * //                 "parentId": "root-h-ge",
 * //                 "type": "node",
 * //                 "key": 6
 * //               }
 * //             ]
 * //           },
 * //           {
 * //             "id": "root-h-gf",
 * //             "parentId": "root-h",
 * //             "type": "object",
 * //             "key": "gf",
 * //             "numOfChilren": 7,
 * //             "children": [
 * //               {
 * //                 "id": "root-h-gf-gfa",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfa",
 * //                 "text": 61
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gfb",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfb",
 * //                 "text": 612.3
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gfc",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfc",
 * //                 "text": "abc"
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gfd",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfd",
 * //                 "text": "645-de"
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gfe",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfe",
 * //                 "text": true
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gff",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gff",
 * //                 "text": null
 * //               },
 * //               {
 * //                 "id": "root-h-gf-gfg",
 * //                 "parentId": "root-h-gf",
 * //                 "type": "node",
 * //                 "key": "gfg"
 * //               }
 * //             ]
 * //           },
 * //           {
 * //             "id": "root-h-gx",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gx",
 * //             "text": true
 * //           },
 * //           {
 * //             "id": "root-h-gy",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gy",
 * //             "text": null
 * //           },
 * //           {
 * //             "id": "root-h-gz",
 * //             "parentId": "root-h",
 * //             "type": "node",
 * //             "key": "gz"
 * //           }
 * //         ]
 * //       },
 * //       {
 * //         "id": "root-i",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": "i"
 * //       },
 * //       {
 * //         "id": "root-Symbol(i-sym-key-a)",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "text": "i-sym-value"
 * //       },
 * //       {
 * //         "id": "root-Symbol(i-sym-key-b)",
 * //         "parentId": "root",
 * //         "type": "object",
 * //         "numOfChilren": 7,
 * //         "children": [
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfa",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfa",
 * //             "text": 61
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfb",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfb",
 * //             "text": 612.3
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfc",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfc",
 * //             "text": "abc"
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfd",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfd",
 * //             "text": "645-de"
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfe",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfe",
 * //             "text": true
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symff",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symff",
 * //             "text": null
 * //           },
 * //           {
 * //             "id": "root-Symbol(i-sym-key-b)-symfg",
 * //             "parentId": "root-Symbol(i-sym-key-b)",
 * //             "type": "node",
 * //             "key": "symfg"
 * //           }
 * //         ]
 * //       }
 * //     ]
 * //   }
 * // ]
 *
 * let arr = [
 *     91,
 *     912.3,
 *     'abc',
 *     '945-de',
 *     true,
 *     null,
 *     function() {},
 *     [
 *         5,
 *         54.3,
 *         'xyz',
 *         {
 *             gf: {
 *                 gfa: 61,
 *                 gfb: 612.3,
 *                 gfc: 'abc',
 *                 gfd: '645-de',
 *                 gfe: true,
 *                 gff: null,
 *                 gfg: function() {},
 *             },
 *         },
 *     ],
 *     {
 *         h: {
 *             ga: 81,
 *             gb: 812.3,
 *             gc: 'abc',
 *             gd: '845-de',
 *             ge: [
 *                 71,
 *                 712.3,
 *                 'abc',
 *                 '745-de',
 *                 true,
 *                 null,
 *                 function() {},
 *             ],
 *             gx: true,
 *             gy: null,
 *             gz: function() {},
 *         },
 *         i: Symbol('foo'),
 *         [Symbol('i-sym-key-a')]: 'i-sym-value',
 *         [Symbol('i-sym-key-b')]: {
 *             symfa: 61,
 *             symfb: 612.3,
 *             symfc: 'abc',
 *             symfd: '645-de',
 *             symfe: true,
 *             symff: null,
 *             symfg: function() {},
 *         },
 *     },
 * ]
 * r = convertToTree(arr)
 * console.log('convertToTree arr', JSON.stringify(r, null, 2))
 * // => convertToTree arr [
 * //   {
 * //     "id": "root",
 * //     "parentId": "",
 * //     "type": "array",
 * //     "key": "root",
 * //     "numOfChilren": 9,
 * //     "children": [
 * //       {
 * //         "id": "root-0",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 0,
 * //         "text": 91
 * //       },
 * //       {
 * //         "id": "root-1",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 1,
 * //         "text": 912.3
 * //       },
 * //       {
 * //         "id": "root-2",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 2,
 * //         "text": "abc"
 * //       },
 * //       {
 * //         "id": "root-3",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 3,
 * //         "text": "945-de"
 * //       },
 * //       {
 * //         "id": "root-4",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 4,
 * //         "text": true
 * //       },
 * //       {
 * //         "id": "root-5",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 5,
 * //         "text": null
 * //       },
 * //       {
 * //         "id": "root-6",
 * //         "parentId": "root",
 * //         "type": "node",
 * //         "key": 6
 * //       },
 * //       {
 * //         "id": "root-7",
 * //         "parentId": "root",
 * //         "type": "array",
 * //         "key": 7,
 * //         "numOfChilren": 4,
 * //         "children": [
 * //           {
 * //             "id": "root-7-0",
 * //             "parentId": "root-7",
 * //             "type": "node",
 * //             "key": 0,
 * //             "text": 5
 * //           },
 * //           {
 * //             "id": "root-7-1",
 * //             "parentId": "root-7",
 * //             "type": "node",
 * //             "key": 1,
 * //             "text": 54.3
 * //           },
 * //           {
 * //             "id": "root-7-2",
 * //             "parentId": "root-7",
 * //             "type": "node",
 * //             "key": 2,
 * //             "text": "xyz"
 * //           },
 * //           {
 * //             "id": "root-7-3",
 * //             "parentId": "root-7",
 * //             "type": "object",
 * //             "key": 3,
 * //             "numOfChilren": 1,
 * //             "children": [
 * //               {
 * //                 "id": "root-7-3-gf",
 * //                 "parentId": "root-7-3",
 * //                 "type": "object",
 * //                 "key": "gf",
 * //                 "numOfChilren": 7,
 * //                 "children": [
 * //                   {
 * //                     "id": "root-7-3-gf-gfa",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfa",
 * //                     "text": 61
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gfb",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfb",
 * //                     "text": 612.3
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gfc",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfc",
 * //                     "text": "abc"
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gfd",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfd",
 * //                     "text": "645-de"
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gfe",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfe",
 * //                     "text": true
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gff",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gff",
 * //                     "text": null
 * //                   },
 * //                   {
 * //                     "id": "root-7-3-gf-gfg",
 * //                     "parentId": "root-7-3-gf",
 * //                     "type": "node",
 * //                     "key": "gfg"
 * //                   }
 * //                 ]
 * //               }
 * //             ]
 * //           }
 * //         ]
 * //       },
 * //       {
 * //         "id": "root-8",
 * //         "parentId": "root",
 * //         "type": "object",
 * //         "key": 8,
 * //         "numOfChilren": 2,
 * //         "children": [
 * //           {
 * //             "id": "root-8-h",
 * //             "parentId": "root-8",
 * //             "type": "object",
 * //             "key": "h",
 * //             "numOfChilren": 8,
 * //             "children": [
 * //               {
 * //                 "id": "root-8-h-ga",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "ga",
 * //                 "text": 81
 * //               },
 * //               {
 * //                 "id": "root-8-h-gb",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gb",
 * //                 "text": 812.3
 * //               },
 * //               {
 * //                 "id": "root-8-h-gc",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gc",
 * //                 "text": "abc"
 * //               },
 * //               {
 * //                 "id": "root-8-h-gd",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gd",
 * //                 "text": "845-de"
 * //               },
 * //               {
 * //                 "id": "root-8-h-ge",
 * //                 "parentId": "root-8-h",
 * //                 "type": "array",
 * //                 "key": "ge",
 * //                 "numOfChilren": 7,
 * //                 "children": [
 * //                   {
 * //                     "id": "root-8-h-ge-0",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 0,
 * //                     "text": 71
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-1",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 1,
 * //                     "text": 712.3
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-2",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 2,
 * //                     "text": "abc"
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-3",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 3,
 * //                     "text": "745-de"
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-4",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 4,
 * //                     "text": true
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-5",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 5,
 * //                     "text": null
 * //                   },
 * //                   {
 * //                     "id": "root-8-h-ge-6",
 * //                     "parentId": "root-8-h-ge",
 * //                     "type": "node",
 * //                     "key": 6
 * //                   }
 * //                 ]
 * //               },
 * //               {
 * //                 "id": "root-8-h-gx",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gx",
 * //                 "text": true
 * //               },
 * //               {
 * //                 "id": "root-8-h-gy",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gy",
 * //                 "text": null
 * //               },
 * //               {
 * //                 "id": "root-8-h-gz",
 * //                 "parentId": "root-8-h",
 * //                 "type": "node",
 * //                 "key": "gz"
 * //               }
 * //             ]
 * //           },
 * //           {
 * //             "id": "root-8-i",
 * //             "parentId": "root-8",
 * //             "type": "node",
 * //             "key": "i"
 * //           },
 * //           {
 * //             "id": "root-8-Symbol(i-sym-key-a)",
 * //             "parentId": "root-8",
 * //             "type": "node",
 * //             "text": "i-sym-value"
 * //           },
 * //           {
 * //             "id": "root-8-Symbol(i-sym-key-b)",
 * //             "parentId": "root-8",
 * //             "type": "object",
 * //             "numOfChilren": 7,
 * //             "children": [
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfa",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfa",
 * //                 "text": 61
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfb",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfb",
 * //                 "text": 612.3
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfc",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfc",
 * //                 "text": "abc"
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfd",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfd",
 * //                 "text": "645-de"
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfe",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfe",
 * //                 "text": true
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symff",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symff",
 * //                 "text": null
 * //               },
 * //               {
 * //                 "id": "root-8-Symbol(i-sym-key-b)-symfg",
 * //                 "parentId": "root-8-Symbol(i-sym-key-b)",
 * //                 "type": "node",
 * //                 "key": "symfg"
 * //               }
 * //             ]
 * //           }
 * //         ]
 * //       }
 * //     ]
 * //   }
 * // ]
 *
 */
function convertToTree(data, opt = {}) {

    //check
    if (!iseobj(data) && !isearr(data)) {
        return []
    }

    //bindKey
    let bindKey = get(opt, 'bindKey', null)
    if (!isestr(bindKey)) {
        bindKey = 'id'
    }

    //bindParent
    let bindParent = get(opt, 'bindParent', null)
    if (!isestr(bindParent)) {
        bindParent = 'parentId'
    }

    //bindText
    let bindText = get(opt, 'bindText', null)
    if (!isestr(bindText)) {
        bindText = 'text'
    }

    //bindChildren
    let bindChildren = get(opt, 'bindChildren', null)
    if (!isestr(bindChildren)) {
        bindChildren = 'children'
    }

    //bindType
    let bindType = get(opt, 'bindType', null)
    if (!isestr(bindType)) {
        bindType = 'type'
    }

    //bindNumOfChilren
    let bindNumOfChilren = get(opt, 'bindNumOfChilren', null)
    if (!isestr(bindNumOfChilren)) {
        bindNumOfChilren = 'numOfChilren'
    }

    //bindRoot
    let bindRoot = get(opt, 'bindRoot', null)
    if (!isestr(bindRoot)) {
        bindRoot = 'root'
    }

    //saveExtProps
    let saveExtProps = get(opt, 'saveExtProps', null)
    if (!isbol(saveExtProps)) {
        saveExtProps = false
    }

    //root
    if (isestr(bindRoot)) {
        data = {
            [bindRoot]: data,
        }
    }

    //flattenToConn
    let arrObj = flattenToConn(data, {
        bindKey,
        bindParent,
        bindText,
        bindType,
        bindNumOfChilren,
    })
    // console.log('arrObj', arrObj)

    //composeToTree
    let nodes = composeToTree(arrObj, {
        bindKey,
        bindParent,
        bindChildren,
        saveExtProps,
    })
    // console.log('nodes', nodes)

    return nodes
}


export default convertToTree