it/zone

Zone 底座:迭代函数


Methods

(static) itAmb(input, consumer) → {Object/Array}

「标准」Ux.itAmb

基本介绍

「Ambiguity」二义性函数,consumer 负责每一个元素的生成

  1. 如果输入是 Array 则返回 Array
  2. 如果输入是 Object 则返回 Object

该方法会遍历Object或Array针对每一个键值对和元素执行consumer方法,并且返回执行结果,执行过程中会实现二义性双遍历,只是需要注意的点:

  • consumer 函数是一个 object -> object 的函数,此处是 JavaScript 中的 Object 对象
  • 此函数只针对 [{}] 类型的对象数组生效(数组每个元素都是对象),或直接作用于 {}
  • 一旦函数被封装就会导致此处出现双遍历,也是「二义性」的来源。

示例


 // 此处 room 可能是Array也可能是Object
 const calcRoomCheckIn = (reference, order = {}, room) => Ux.itAmb(room, (amb => {
    const {schedules = []} = order;
    const orders = [order];
    let $room = Ux.clone(amb);
    $room.leaving = true;
    $room.arriving = true;
    mountColor(reference, $room);
    mountOrder(orders, schedules, $room);
    mountOp(reference, $room);
    return $room;
}))
Parameters:
Name Type Description
input Object/Array

二义性专用方法

consumer function

执行函数

Returns:

返回任意值

Type
Object/Array

(static) itElement(data, field, itemFun)

「标准」Ux.itElement

  1. 该函数会一直递归,直接执行一层 Array 中的遍历,并且递归替换处理结果。
  2. 命中字段中的元素会在处理过后执行原始替换。
const array = [
     { "name": "Lang", "email": "lang.yu@hpe.com" },
     [
         { name: "Lang1" },
         { name: "Lang2" }
     ]
]
Ux.itElement(array, "name", (value, item) => {
     // value:该字段的值
     // item:被遍历的对象本身,它包含了 name 的值
    return "Hi " + name;
});

最终生成的数据格式已经被改动过了,该函数是具有修改副作用的,最终格式中所有的name字段中的数据都发生了改变:

{
    { "name" : "Hi Lang", "email": "lang.yu@hpe.com" },
    [
        { "name": "Hi Lang1" },
        { "name": "Hi Lang2" }
    ]
}

参数函数 itemFun

参数名 类型 说明
value String 被遍历的字段值
item Object 被遍历到的包含了该字段的对象
Parameters:
Name Type Description
data Array.<Object>

被遍历的数组(一般是对象数组)

field String

需要提取的对象对应的字段信息

itemFun function

每一个元素的遍历专用处理

Throws:

10071 异常(console.error)

(static) itFull(data, items, fieldFun)

「引擎」Ux.itFull

data 中的每一个元素和 items 中的 key = value 构成一个条目,每个条目包含了三元操作数: ( element, key, value ),执行前提是 key 和 value 都合法才执行。

排除的 key, value 值包括 undefined、null、0 等所有无法通过JS判断的内容

特定场景代码参考下边片段:

 const predicate = Abs.isFunction(fnPredicate) ? fnPredicate : () => true;
 Abs.itFull(array, object, (item = {}, key, value) => {
    if (predicate(value)) {
        fnExecute(item, key, value);
    }
});

参数函数 fieldFun

参数名 类型 说明
item Object 首参:数组中的元素内容
key String 第二参:传入对象 items 的键值对中的键
value Unknown 第二参:传入对象 items 的键值对中的值
Parameters:
Name Type Description
data Array

输入的数组数据

items Object

输入的需要验证的 items 数据

fieldFun function

最终执行的特殊函数

(static) itMatrix(matrix, eachFun) → {Array.<T>}

「标准」Ux.itMatrix

遍历二维数组

  1. 如果元素是 Array,则 eachFun 作用于每一个 Object 类型的元素。
  2. 如果元素是 Object,则 eachFun 直接作用于这个 Object。
  3. 会一直递归调用到最下层。
const matrix = [
     [
         { name: "name1", age: "age1" },
         { name: "name2", age: "age2" }
     ],
     { name: "name3", age: "age3" }
]

Ux.itMatrix(matrix, (item) => {
     console.info(item.name);
});
// 上述代码会依次打印:name1, name2, name3
Parameters:
Name Type Description
matrix Array.<(Array.<T>|Object)>

二维表矩阵数据

eachFun function

作用于每一个元素的单子函数

Returns:

返回 matrix 本身

Type
Array.<T>

(static) itObject(data, executor, invalid)

「标准」Ux.itObject

对象遍历函数,直接遍历 Object 对象,生成 key = value 的执行函数专用。

const user = {
    username: "Lang",
    email: "lang.yu@hpe.com"
}
Ut.itObject(user, (key, value) => {

    // 此处的 key, value 对应
    // 1. username = Lang
    // 2. email = lang.yu@hpe.com
});
Parameters:
Name Type Default Description
data Object

将会被遍历的 Object 对象

executor function

作用于 key, value 的执行函数

invalid boolean false

value非法的时候是否执行executor函数

(static) itRepeat(loop, consumer) → {Array}

「标准」Ux.itRepeat

重复执行多次的专用函数,第一参数为循环和迭代的次数。

Parameters:
Name Type Default Description
loop Number 0

循环的次数

consumer function

每次循环执行的函数

Returns:

返回每一次的返回值

Type
Array

(static) itRow(row) → {Array}

「引擎」Ut.itRow

  1. 如果输入是 Array,则直接返回 Array。
  2. 如果输入的是 Object,则直接返回 object.items 数据,前提是 items 必须是 Array。
Parameters:
Name Type Description
row Array | Object

被遍历的行

Returns:

规范化过后的行相关信息

Type
Array

(static) itTree(treeArray, executor)

「标准」Ut.itTree

遍历树形数组,数组中的每个元素可能包含 children 属性,传入数据属于已经构造好的 treeArray,该函数 会递归执行每一个元素,元素包含两种:

  1. 顶层 Array 中的每一个元素 element。
  2. 没个元素若包含了 Array 类型的 children 则表示它包含子节点,直接执行每一个子节点。
  3. executor 为每个元素的处理函数(副作用函数)。

框架内部在注入 _level 字段时候会使用该函数


Ux.itTree(treeData, (item) => {
     if (item.hasOwnProperty("_level")) {
         item.selectable = item._level <= selectable;
     }
});
Parameters:
Name Type Description
treeArray Array

传入的数组对象。

executor function

执行每个元素的函数。

(static) itUi(ui, eachFun, itemFun) → {Array.<Array.<T>>}

「引擎」Ux.itUi

表单 form 中的配置 ui 的专用遍历函数,会生成带坐标的二维矩阵。

该函数主要用于表单解析中,解析 ui 的专用函数,这里不提供示例代码,主要解析结构,如配置项为:

{
    "_form": {
        "ui": [
            [
                "name,用户名"
            ],
            [
                "email,邮箱",
                {
                    "field": "age",
                    "optionItem.label": "年龄"
                }
            ]
        ]
    }
}

解析过后的最终数据结构如:

name 字段,位于:      ui[0][0]。
email 字段,位于:     ui[1][0]。
age 字段,位于:       ui[1][1]。

ui[rowIndex][columnIndex] 中的两个参数如下:

  • row:行索引,从0开始。
  • column:列索引,从0开始。
Parameters:
Name Type Description
ui Array.<(Array.<T>|String)>

矩阵配置,Grid布局中的表单单元格。

eachFun function

单个组件专用处理函数,处理 <Form.Item>{children}</Form.Item> 标签内的 children 专用。

itemFun function

单个组件中的 Item 处理函数,处理 <Form.Item {...attrs}> 中的 attrs 专用。

Returns:

返回矩阵相关配置,ui[rowIndex][columnIndex] 格式

Type
Array.<Array.<T>>

(static) itValue(object, transformer, keyopt)

「标准」Ux.itValue

多迭代模式下的迭代专用操作

  1. 遍历 object 中的的每一个字段 field。
  2. 拿到 field 对应的值,判断该值 valueRef 是否是一个合法的 Object。
  3. 如果合法,则执行 transformer 函数(同步函数)得到对应的返回值 processed。
  4. 根据 key 进行分离合并操作
    1. 如果没有传入 key,则直接将转换过的数据合并到 valueRef 变量中。
    2. 如果传入了 key
      1. 如果 valueRef 中包含了 key 键的值,则直接合并(valueRef[key], processed)
      2. 如果 valueRef 中不包含 key 键的值,则设置:valueRef[key] = processed

在框架内部使用该函数的代码如下:


const parsePlugin = (buttons = {}, options = {}) => {
    Ux.itValue(buttons, (button = {}) => {
        const {plugin = {}} = button;
        const configuration = {};
        if (plugin.tooltip) {
            configuration.tooltip = true;
        }
        if (plugin.confirm) {
            configuration.confirm = options[plugin.confirm];
        }
        if (plugin.prompt) {
            configuration.prompt = options[plugin.prompt];
        }
        if (plugin.connect) {
            configuration.connect = options[plugin.connect];
        }
        if (plugin.message) {
            configuration.message = options[plugin.message];
        }
        return configuration;
    }, 'plugin');
    return buttons;
};

该函数一般在特殊场景中使用,不会用于单一的场景,特殊场景遍历复杂,会统一消费。

参数函数 transformer

参数名 类型 说明
valueRef Object 遍历到的默认的 Object 对象
Parameters:
Name Type Attributes Description
object Object

被迭代的JS的Object对象

transformer function

执行转换的函数

key String <optional>

可选的传入键