value/zone

Zone 底座:值处理函数


Methods

(static) valueAppend(item, field, value)

「标准」Ux.valueAppend

不重复追加值到item对象中(包含则不设置)

框架内部的使用代码如:


    const {$clear, form} = reference.props;
    // 记录切换:从更新表单 -> 添加表单切换
    if ($clear && $clear.is()) {
         const keys = $clear.to();
         keys.forEach(key => Value.valueAppend(data, key, undefined));
    }

这里需要解释这个API和Ux.assign(mode=2)的区别,在Ux.assign中,追加模式是做合并,而且追加时支持嵌套追加,

除了顶层Object以外它的子对象也会实现合并追加流程,而Ux.valueAppend是单纯的值追加过程,只在当前传入对象中追加

是否包含了field的情况。

示例:

const item = {
    "name": "emma",
    "phone": "13550878787"
}
Ux.valueAppend(item, "age", 18);

上述代码执行过后

item = {
    "name": "emma",
    "phone": "13550878787",
    "age": 18
}
Parameters:
Name Type Description
item Object

被追加字段的对象引用

field String

将要追加的字段名

value any

将要追加的字段值

(static) valueArray(input) → {Array}

「标准」Ux.valueArray

对数据进行规范化解析,确保转换过后的一定是 Array 。

  1. 如果 input = undefined,返回 []
  2. 如果 input = Array,直接返回
  3. 如果 input = Object,则检查 list 节点(必须是Array)
Parameters:
Name Type Description
input any

输入的数据

Returns:

返回转换好的Array

Type
Array

(static) valueBoolean(literal) → {boolean}

「标准」Ux.valueBoolean

将输入的数据转换为 boolean 类型。

示例:

const value1 = "true";
const output1 = Ux.valueBoolean(value1);

const value2 = "123";
const output2 = Ux.valueBoolean(value2);

// 最终结果
// output1 的值为 true
// output2 的值为 false
Parameters:
Name Type Description
literal any

待转换的输入数据

Returns:

转换后的 boolean 值

Type
boolean

(static) valueCopy(target, source, field) → {Object}

「标准」Ux.valueCopy

该函数负责将 field 字段中的信息从 source 拷贝到 target 中。

  1. field 为 String:拷贝单个字段数据
  2. field 为 Array:拷贝多个字段数据
  3. 如果读取的数据为 Object / Array 则采用深度拷贝

示例:

const params1 = {
    "orderId": "239975a7-f164-43b3-a9d1-4516f98c1948",
    "amount": 120,
    "signMobile": "18604409876",
    "indent": "NUM.PAYBILL",
    "language": "cn",
    "level": 2,
    "name": "ox.rbac.role"
}
const params2 = {
    "language": "en",
    "level": 3,
    "name": "ox.rbac.role"
}
const value = Ux.valueCopy(params1, [
        "orderId",
        "amount",
        "signMobile",
        "indent"
    ], params2);

执行上述代码之后的结果:

value = {
    "orderId": "239975a7-f164-43b3-a9d1-4516f98c1948",
    "amount": 120,
    "signMobile": "18604409876",
    "indent": "NUM.PAYBILL",
    "language": "en",
    "level": 3,
    "name": "ox.rbac.role"
}
Parameters:
Name Type Description
target Object

拷贝目标对象

source Object

拷贝源对象

field String | Array

需要拷贝的字段信息

Returns:

最终拷贝过后的对象

Type
Object

(static) valueDatetime(value, format) → {Dayjs}

「标准」Ux.valueDatetime

时间转换标准函数,将字符串格式的对象转换成合法 Dayjs 对象,返回失败则报错。

示例写法:

const now = Ux.valueDatetime(Ux.valueNow("HH:mm:ss"), "HH:mm:ss");

可支持的 format 格式信息详见 Ux.valueNow 。

Parameters:
Name Type Description
value String

被转换的字符串。

format String

Dayjs可解析的格式信息,默认ISO。

Returns:

返回转换后的 Dayjs 对象。

Type
Dayjs

(static) valueDuration(from, to, mode) → {number}

「标准」Ux.valueDuration

根据from和to计算中间的duration差值。

支持8种计算模式,如下表所示:(各个传入的模式对大小写不敏感,支持缩写和复数。)

模式 缩写 复数 描述
date D dates 日期
day d days 星期(星期日0,星期六6)
month M months 月份(0-11)
year y years
hour h hours 小时
minute m minutes 分钟
second s seconds
millisecond ms milliseconds 毫秒

示例:

const startDate = "2022-06-05";
const mode = "month";
const endDate = "2023-01-25";
const duration = Ux.valueDuration(startDate, endDate, mode);

返回结果:

duration => 7
Parameters:
Name Type Default Description
from String | Dayjs

开始时间

to String | Dayjs

结束时间

mode String day

计算模式

Returns:

返回最终的计算数值

Type
number

(static) valueEndTime(from, duration, mode) → {Dayjs}

「标准」Ux.valueEndTime

根据开始时间、间隔、模式计算结束时间

支持8种模式,如下表所示:(各个传入的模式对大小写不敏感,支持缩写和复数。)

模式 缩写 复数 描述
date D dates 日期
day d days 星期(星期日0,星期六6)
month M months 月份(0-11)
year y years
hour h hours 小时
minute m minutes 分钟
second s seconds
millisecond ms milliseconds 毫秒

示例:

const startDate = "2023-06-04 19:06:55";
const mode1 = "year";
const endDate1 = Ux.valueEndTime(startDate, 7, mode1);
const mode2 = "hour";
const endDate2 = Ux.valueEndTime(startDate, 7, mode2);

返回结果:

endDate1 => "2024-01-04 19:06:55"
endDate2 => "2023-06-05 02:06:55"
Parameters:
Name Type Default Description
from String | Dayjs

开始时间

duration Number

间隔时间

mode String day

计算模式

Returns:

返回结束时间

Type
Dayjs

(static) valueExpr(expr, data, keep) → {string}

「引擎」Ux.valueExpr

(通常内部)解析表达式强化方法,主要用于解析Zero中带:的自定义表达式相关信息。

const user = {
    username: "Lang",
    age: 12
};

const keepValue = Ux.valueExpr("你的名字:username", user, true);
// 输出:你的名字Lang。
// 执行后 user 的值为:{ username: "Lang", age: 12 };

const removeValue = Ux.valueExpr("你的名字:username", user);
// 输出:你的名字Lang。
// 之后后 user 的值:{ age:12 }; 原始的 username 已经从输入Object中移除。

注意第三参数,第三参数会对传入参数执行保留或不保留的两种方案,如果 keep = false(默认),那么在执行过后,原始入参中 被替换的参数属性会被移除掉,而 keep = true 时则不会移除,会保留其数据信息,并且注意该方法和Ux.formatExpr的区别, 通常valueExpr是直接使用,建议在内部调用,而formatExpr会有更多操作,所以提供给用户调用。

Parameters:
Name Type Default Description
expr String

传入的表达式或字段名。

data Object

记录信息。

keep boolean false

格式化过后是否保留原始的值。

Returns:

返回最终格式化后的数据。

Type
string

(static) valueFactor(literal) → {Number}

「标准」Ux.valueFactor

因子计算函数,将一个带 % 号的字符串转换成浮点数,转换不成功则返回 undefined 。

示例:

const item = "62.5%";
const value = Ux.valueFactor(item);

// value 的值为 0.625
Parameters:
Name Type Description
literal String

将要被转换的字符串

Returns:

返回最终转换后的浮点数

Type
Number

(static) valueFind(target, attrPath) → {any|*}

「引擎」Ux.valueFind

配置解析统一调用函数(特殊应用)

  1. 如果 attrPath 长度为1,则直接提取 target 中的:target[attrPath[0]]
  2. 如果长度大于2,则先提取target[attrPath[0]],其次提取第二阶段名称,暂时只支持长度为2的模式。

内部执行函数代码示例。

 PROP: (expression, {props}) => fnPredicate("PROP", expression, () => {
     const path = expression.split('.'); // 路径解析
     return T.valueFind(props, path);
 }),
Parameters:
Name Type Description
target any

被查找的引用信息。

attrPath Array

属性路径信息。

Returns:

返回最终解析的属性值。

Type
any | *

(static) valueFloat(literal, dft, digest) → {Number}

「标准」Ux.valueFloat

将一个字符串转换成合法浮点数,保证转换成功,如果出现转换失败,取默认值。

示例:

const valid = "12.1";
const okValue = Ux.valueFloat(valid, 0.0, 1);

const invalid = null;
const koValue = Ux.valueFloat(invalid, 0.00);

// 最终结果
// okValue 的值为 12.1
// koValue 的值为 0.00
Parameters:
Name Type Default Description
literal String

被转换的字符串

dft Number 0

转换失败的默认值

digest Number 2

小数点之后的位数

Returns:

返回最终浮点数

Type
Number

(static) valueInt(literal, dft) → {Number}

「标准」Ux.valueInt

将一个字符串转换成整数,保证转换成功,如果出现转换失败,取默认值。

const valid = "1231";
const okValue = Ux.valueInt(valid, 12);

const invalid = null;
const koValue = Ux.valueInt(invalid, 12);

// 最终结果
// okValue 的值为 1231
// koValue 的值为 12
Parameters:
Name Type Default Description
literal String

被转换的字符串

dft Number 0

转换失败的默认值

Returns:

返回转换后的数值

Type
Number

(static) valueJDatetime(data, …fields) → {Object}

「标准」Ux.valueJDatetime

时间转换专用函数,将对象中的 Object 中所有 fields 字段转换成时间格式。

这个函数只支持 ISO 格式,批量转换对象中的字段。

示例:

const value = {
    cretedAt: "xxx",
    updatedAt: "xxx"
}
// 下列代码会将 value 对象中的 cretedAt 和 updatedAt 字段信息均转换为 ISO 的时间格式。
const value2 = Ux.valueJDatetime(value, "cretedAt", "updatedAt");
// 等价于
const value2 = Ux.valueJDatetime(value, ["cretedAt", "updatedAt"]);
Parameters:
Name Type Attributes Description
data Object

被转换的对象数据。

fields Array.<String> <repeatable>

被转换对象的字段数组信息。

Returns:

被转换后的对象数据

Type
Object

(static) valueLadder(item) → {Object}

「标准」Ux.valueLadder

梯度处理专用函数,函数执行流程

  1. 先全部拉平,生成带.属性的对象(一层结构)。
  2. 按照拉平的属性名进行排序(顺序处理)。
  3. 然后执行结构化,将所有的.操作符移除。

最终目的是生成Json树。

const config = {
    "optionJsx.item": 12,
    "optionItem.label": "标签",
    "field": "email",
    "optionItem.style.color": "red",
    "ajax.magic.params": {
        "name": "Lang",
        "age": 13
    }
}
const values = Ux.valueLadder(config);

上述代码执行过后,会返回下边的结果:

{
    "ajax":{
        "magic":{
            "params":{
                "name": "Lang",
                "age": 13
            }
        }
    },
    "field": "email",
    "optionItem":{
        "label": "标签",
        "style": {
            "color": "red"
        }
    },
    "optionJsx":{
        "item": 12
    }
}
Parameters:
Name Type Description
item Object

输入对象处理

Returns:

返回最终构造的对象信息

Type
Object

「标准」Ux.valueLink

vConn = true

M1 = {
    "k1": "v1",
    "k2": "v2"
},

M2 = {
    "v1": "value1",
    "v2": "value2"
}

R = {
    "k1": "value1",
    "k2": "value2"
}

vConn = false

M1 = {
    "k1": "v1",
    "k2": "v2"
},

M2 = {
    "k1": "value1",
    "k2": "value2"
}

R = {
    "v1": "value1",
    "v2": "value2"
}
Parameters:
Name Type Default Description
from Object

拷贝源对象

to Object

拷贝目标对象

vConn Boolean false

选择操作模式

Returns:

最终拷贝过后的对象

Type
Object

(static) valueMap(target, source, config) → {Object}

「标准」Ux.valueMap

此函数与valueOk功能很像,为将 config 中的信息作为映射将 source 的信息拷贝到 target 。

示例:

const source = {
     username: "emma"
}
const target = {
     email: "1096721799@qq.com"
}
const config = {
     username: "userfullname"
}
const value = Ux.valueMap(target, source, config);

执行上述代码之后的结果为:

value = {
    userfullname: "emma",
    email: "1096721799@qq.com"
}
Parameters:
Name Type Description
target Object

拷贝目标对象

source Object

拷贝源对象

config Object

需要拷贝的字段映射信息

Returns:

最终拷贝过后的对象

Type
Object

(static) valueNow(pattern) → {Dayjs}

「标准」Ux.valueNow

返回当前时间,直接得到 Dayjs 对象。

如果没有传 pattern 参数,则默认返回 ISO 8601 字符串。

示例(假设当前时间为2019-01-25 00:00:00)

const dateNow = Ux.valueNow();
// 执行上述代码之后,dateNow = '2019-01-25T02:00:00.000Z'

可支持的格式化占位符列表如下:

标识 示例 描述
YY 18 年,两位数
YYYY 2018 年,四位数
M 1-12 月,从1开始
MM 01-12 月,两位数
MMM Jan-Dec 月,英文缩写
MMMM January-December 月,英文全称
D 1-31
DD 01-31 日,两位数
d 0-6 一周中的一天,星期天是0
dd Su-Sa 最简写的星期几
ddd Sun-Sat 简写的星期几
dddd Sunday-Saturday 星期几,英文全称
H 0-23 小时
HH 00-23 小时,两位数
h 1-12 小时,12小时制
hh 01-12 小时,12小时制,两位数
m 0-59 分钟
mm 00-59 分钟,两位数
s 0-59
ss 00-59 秒,两位数
S 0-9 毫秒(十),一位数
SS 00-99 毫秒(百),两位数
SSS 000-999 毫秒,三位数
Z -05:00 UTC的偏移量,±HH:mm
ZZ -0500 UTC的偏移量,±HHmm
A AM/PM 上/下午,大写
a am/pm 上/下午,小写
Do 1st...31st 月份的日期与序号
... ... 其他格式(依赖 AdvancedFormat 插件 )
Parameters:
Name Type Description
pattern String

可支持的时间格式。

Returns:

返回合法的 Dayjs 对象。

Type
Dayjs

(static) valueOk(input, config, output) → {Object}

「引擎」Ux.valueOk

该函数负责将 field 字段中的信息从 source 拷贝到 target 中。

  1. field 为 String:拷贝单个字段数据
  2. field 为 Array:拷贝多个字段数据
  3. 如果读取的数据为 Array 则采用深度拷贝

示例:

const params1 = {
    "orderId": "239975a7-f164-43b3-a9d1-4516f98c1948",
    "amount": 120,
    "signMobile": "18604409876",
    "indent": "NUM.PAYBILL",
    "language": "cn",
    "level": 2,
    "name": "ox.rbac.role"
}
const params2 = {
    "language": "en",
    "level": 3,
    "name": "ox.rbac.role"
}
const value = Ux.valueOk(params1, [
        "relatedId,orderId",
        "amount",
        "signMobile",
        "indent=NUM.SETTLEMENT"
    ], params2);

执行上述代码之后的结果:

value = {
    "relatedId": "239975a7-f164-43b3-a9d1-4516f98c1948",
    "amount": 120,
    "signMobile": "18604409876",
    "indent": "NUM.SETTLEMENT",
    "language": "en",
    "level": 3,
    "name": "ox.rbac.role"
}
Parameters:
Name Type Description
input Object

拷贝源对象

config Array | String

需要拷贝的字段信息

output Object

拷贝目标对象(可选)

Returns:

最终拷贝过后的对象

Type
Object

(static) valuePair(expr) → {Object}

「标准」Ux.valuePair

表达式解析成对象的专用函数

  1. 如果 expr 是 String 则执行解析。
  2. 如果 expr 是 Object类型,则直接返回 expr 这个对象。

注意:如果值里面本身包含了逗号,则需要用markdown专用的语法对逗号进行转换。

const user = "username=Lang,email=lang.yu@hpe.com";
const userObj = Ux.valuePair(user);

上述代码执行后生成格式如:

{
    "username": "Lang",
    "email": "lang.yu@hpe.com"
}
Parameters:
Name Type Description
expr String

表达式信息,可能包含键值对:name1=value1,name2=value2

Returns:

返回转换好的对象

Type
Object

(static) valueParse(valueOrExpr) → {Object}

「标准」Ux.valueParse

将字符串解析成

{
    "type": "解析类型",
    "expression": "最终表达式"
}

示例:

const value = "PROP:app.mHotel.key";
const outValue = Ux.valueParse(value);

最终解析成:

{
    "type": "PROP",
    "expression": "app.mHotel.key"
}
Parameters:
Name Type Description
valueOrExpr String

表达式信息

Returns:

计算表达式的解析结果。

Type
Object

(static) valuePath(data, path) → {null|any}

「标准」Ux.valuePath

对象树检索专用函数,可根据 path 检索对象树

示例:

const user = {
    "teacher":{
        "son":{
            "username": "Lang"
        }
    }
}
const teacher = Ux.valuePath(user, "teacher");
const son = Ux.valuePath(user, "teacher.son");
const username = Ux.valuePath(user, "teacher.son.username");

返回结果:

teacher = { "son":{ "username": "Lang" } }
son = { "username": "Lang"}
username = "Lang"
Parameters:
Name Type Description
data Object

将要搜索的对象。

path String

路径必须是一个字符串,并且包含.格式。

Returns:

返回最终搜索到的值,否则为 null。

Type
null | any

(static) valuePinyin(input) → {String}

「标准」Ux.valuePinyin

将汉字转换成拼音,在某些场景中,中文字转换成拼音后可根据拼音的字典序进行排列,这是业务场景所必须的,这种转换 也是有必要的,而系统中主要使用了js-pinyin模块实现直接转换,封装了第三方库。

示例:

const name = "虞浪";
const pinyin = Ux.valuePinyin(name);

返回结果:

pinyin => "yulang"
Parameters:
Name Type Description
input String

输入的数据

Returns:

返回转换好的拼音信息

Type
String

(static) valueSTDN(value, server) → {Object}

「标准」Ux.valueSTDN

此API功能与 valueT 相似,均为类型保障,区别在于 valueT 是单值处理,而 valueSTDN 为全值处理。

类型支持的值如下:

  • BOOLEAN: 布尔值
  • INTEGER:整数
  • DECIMAL:浮点数
  • STRING:字符串
  • TIME:时间
  • DATETIME:日期时间
  • DATE:日期

虽然目前服务端和客户端支持的类型一致,但有些细节有区别,比如客户端的时间是 HH:mm 格式,而服务端为 HH:mm:ss 格式。

简单示例如下:

const value = {
    "active": "true",
    "__metadata":{
        "active": "BOOLEAN"
    }
}
// 使用客户端解析模式,根据 __metadata 的设置,将 active 的值类型转换为 BOOLEAN。
const data1 = Ux.valueSTDN(value);
// 使用服务端解析模式,根据 __metadata 的设置,将 active 的值类型转换为 BOOLEAN。
const data2 = Ux.valueSTDN(value, true);
Parameters:
Name Type Default Description
value Object

传入的值

server Boolean false

是否使用服务端解析模式

Returns:

最终类型化后的值

Type
Object

(static) valueStartTime(to, duration, mode) → {Dayjs}

「标准」Ux.valueStartTime

根据结束时间、间隔、模式计算开始时间

支持8种模式,如下表所示:(各个传入的模式对大小写不敏感,支持缩写和复数。)

模式 缩写 复数 描述
date D dates 日期
day d days 星期(星期日0,星期六6)
month M months 月份(0-11)
year y years
hour h hours 小时
minute m minutes 分钟
second s seconds
millisecond ms milliseconds 毫秒

示例:

const endDate = "2023-06-04 19:06:55";
const mode1 = "year";
const startDate1 = Ux.valueStartTime(endDate, 7, mode1);
const mode2 = "hour";
const startDate2 = Ux.valueStartTime(endDate, 7, mode2);

返回结果:

startDate1 => "2022-11-04 19:06:55"
startDate2 => "2023-06-04 12:06:55"
Parameters:
Name Type Default Description
to String | Dayjs

结束时间

duration Number

间隔时间

mode String day

计算模式

Returns:

返回开始时间

Type
Dayjs

(static) valueSubset(input, fields) → {Object|Array}

「标准」Ux.valueSubset

将传入的 input 数据根据 fields 取子集。

示例如下:

const input = {
    "name": "lang",
    "age": 18,
    "email": "email@xx.com",
    "active": undefined
}

// 对 input 取子集,只取字段 "name","age","active",生成新的子集并返回。
const value = Ux.valueSubset(input, ["name","age","active"]);
// 等价于
const value = Ux.valueSubset(input, "name", "age", "active");

最终执行过后,返回的value值为:

{
     "name": "lang",
     "age": 18
}

注意:如果值为 undefined ,则不会被取出,示例中字段 active 就没有被取出。

Parameters:
Name Type Description
input Object | Array

传入的值

fields Array.<String>

取子集的字段数组信息

Returns:

最终取的子集

Type
Object | Array

(static) valueT(value, type) → {Boolean|integer|Float|String}

「标准」Ux.valueT

将传入的数据转换为指定的类型(类型保障),类型支持的值如下:

  • BOOLEAN, B: 布尔值
  • INTEGER, I:整数
  • DECIMAL, D:浮点数

注意:

1、在执行转换之前,会进行判断,当传入的值为 undefined 时,不进行转换。 2、当传入的类型不为上述类型,则默认转换为 String。 3、类型转换的解析模式为 客户端 模式,即用 JavaScript 的方式。

传入的类型可以为简写值,示例如下:

const value = "true";
const data = Ux.valueT(value, "BOOLEAN");
// 等价于
const data = Ux.valueT(value, "B");
Parameters:
Name Type Default Description
value any

传入的值

type String STRING

传入的类型

Returns:

最终类型化后的值

Type
Boolean | integer | Float | String

(static) valueValid(data, wild) → {Object}

「标准」Ux.valueValid

将输入数据处理成合法对象,两种模式处理对象Object,由于后端无法识别某些值,所以执行下边处理

  1. 宽模式,0, null, undefined,false 都会被移除,包括 ""。
  2. 严格模式,仅移除 undefined,其他的保留。
const data = {
     "username": "Lang",
     "email": null,
     "age": 0,
     "active": false,
     "address": undefined
}
// 宽模式
const data1 = Ux.valueValid(data, true);
// 严模式
const data2 = Ux.valueValid(data);

最终结果

data1 = {
      "username": "Lang"
 }
data2 = {
      "username": "Lang",
      "email": null,
      "age": 0,
      "active": false
 }

Parameters:
Name Type Description
data Object

输入的Object对象。

wild boolean

是否使用宽模式。

Returns:

返回处理好的数据。

Type
Object