# 基础函数 / 数组 ## `descartesJoin(v_1, v_2, ...)` 声明:function 计算多个值或数组的笛卡尔积 | 参数 | 类型 | 说明 | | ----- | ---- | ------------------ | | `v_1` | any | 第一个值或数组 | | `v_2` | any | 第二个值或数组 | | `...` | any | 可选。更多值或数组 | 返回:array ### 示例 范例01:连接三个输入值 ```tsl return descartesJoin(1->3, 21->22, 3); // 输出: // array( // (1,21,3), // (1,22,3), // (2,21,3), // (2,22,3), // (3,21,3), // (3,22,3)) ``` ## `framemerge(left, right, ons, how, suffixes, if_multi_field, keep_method)` 声明:function 按指定字段连接两个数据表 | 参数 | 类型 | 说明 | | ---------------- | --------------- | -------------------------------------------- | | `left` | table | 左表 | | `right` | table | 右表 | | `ons` | string\|array | 连接字段或左右表连接字段数组 | | `how` | string\|integer | 可选。连接方式,默认 `inner` | | `suffixes` | array | 可选。重名字段后缀,默认 `array('_x', '_y')` | | `if_multi_field` | boolean | 可选。是否按多个共同字段连接,默认 false | | `keep_method` | integer | 可选。重名字段保留方式,默认 0 | 返回:array ### 示例 范例01:按 id 执行内连接 ```tsl left := `array('id': (1, 2), 'left_value': (10, 20)); right := `array('id': (2, 3), 'right_value': (30, 40)); return framemerge( left, right, 'id', 'inner', array('_x', '_y'), false, 0); // 输出:array(("id_x":2,"left_value":20,"id_y":2,"right_value":30)) ``` ## `frameupdate(left, right, ons, type)` 声明:function 按键字段用右表补充或更新左表中的缺失值,并直接修改左表 | 参数 | 类型 | 说明 | | ------- | ------------- | ------------------------------- | | `left` | table | 待更新的左表 | | `right` | table | 提供更新值的右表 | | `ons` | string\|array | 可选。键字段,省略时按下标连接 | | `type` | integer | 可选。缺失值类型位掩码,默认 15 | 返回:array ### 示例 范例01:用右表填充左表缺失值 ```tsl left := `array('id': (1, 2), 'value': (nil, 20)); right := `array('id': (1, 2), 'value': (10, 30)); return frameupdate(left, right, 'id', 15); // 输出: // array( // ("id":1,"value":10), // ("id":2,"value":20)) ``` ## `getSubTableByField(t, fields)` 声明:function 按字段名称提取数据表的指定列 | 参数 | 类型 | 说明 | | -------- | ------ | ---------------------------- | | `t` | array | 数据表 | | `fields` | string | 字段名称,多个名称用分号分隔 | 返回:array ### 示例 范例01:提取 name 和 price 两列 ```tsl value := array( ("name": "A", "price": 1, "amount": 10), ("name": "B", "price": 2, "amount": 20)); return getSubTableByField(value, "name;price"); // 输出: // array( // ("name":"A","price":1), // ("name":"B","price":2)) ``` ## `renameFieldByFormat(t, suffix, if_copy)` 声明:function 按格式字符串批量修改数据表字段名 | 参数 | 类型 | 说明 | | --------- | ------- | --------------------------------- | | `t` | array | 待处理数据表 | | `suffix` | string | 格式字符串,`%s` 表示原字段名 | | `if_copy` | boolean | 可选。是否在副本上修改,默认 true | 返回:array ### 示例 范例01:为全部字段添加后缀 ```tsl value := array(("a": 1, "b": 2)); return renameFieldByFormat(value, "%s_x", true); // 输出:array(("a_x":1,"b_x":2)) ``` ## `speye(m)` 声明:function 创建指定阶数的稀疏单位矩阵 | 参数 | 类型 | 说明 | | ---- | ------- | -------- | | `m` | integer | 矩阵阶数 | 返回:array ### 示例 范例01:创建三阶稀疏单位矩阵 ```tsl return speye(3); // 输出: // array( // (1), // (1:1), // (2:1)) ``` ## `tableType(t)` 声明:function 判断数组的数据表下标类型 | 参数 | 类型 | 说明 | | ---- | ----- | ---------- | | `t` | array | 待判断数组 | 不是数组时返回 `-1`,字符串下标数组返回 `0`,数字下标数组返回 `1` 返回:integer ### 示例 范例01:判断数字下标二维数组 ```tsl return tableType(array((1, 2), (3, 4))); // 输出:1 ``` ## `webFormatToRung(a, type, zero_eps)` 声明:function 将数组中的 nan、nil、正负无穷和接近零的数值替换为短横线 | 参数 | 类型 | 说明 | | ---------- | ------- | ------------------------------------- | | `a` | array | 待处理数组 | | `type` | integer | 可选。替换类型位掩码,默认 15 | | `zero_eps` | real | 可选。接近零的判断阈值,默认 `epsi()` | 返回:any ### 示例 范例01:替换 nil 和 nan ```tsl value := array(nil, nan, 1); return webFormatToRung(value, 15, 1e-10); // 输出:array("-","-",1) ```