Как перебрать список при помощи listReplace?
Достаточно часто есть задача в которой у вас есть list
и вам нужно последовательно обработать каждый его элемент и получить новый list
с обработаннми элеменами.
Для этого используем функцию listReplace.
=: listReplace(list: $startlist; action: $action; value: "value")
startlist: selectList(table: 'table'; field: 'num'; where: 'status' = 4)
action: select(table: 'table_2'; field: 'price'; where: 'num' = $#value)
listReplace берет стартовый list
и для каждого его элемента выполняет action
.
Мы можем в value
задать переменную, в которой будет хранится значение элемента list
, который выполняется в текущий момент.
Те action
будет вызван столько раз, сколько было элементов в списке.
В результате мы получим новый список с таким же количеством элементов, но с другими значениями — значениями, которые мы рассчитали в action
.
Код в action будет выполнен для каждой строки?
Да. Для каждого элемента списка.
Как в коде вызванном в action узнать номер обрабатываемой строки?
У listReplace есть параметр key
в котором можно указать имя переменной в которую будет передан номер обрабатываемой строки.
Если мы хотим вернуть ""
для первых 5 строк:
=: listReplace(list: $startlist; action: $action; value: "value"; key: "key")
startlist: selectList(table: 'table'; field: 'num'; where: 'status' = 4)
action: if(condition: $#key <= 4; then: ""; else: $sel)
// помните, что нумерация списков начинаются с 0
sel: select(table: 'table_2'; field: 'price'; where: 'num' = $#value)
Как в коде вызваном в action использовать значение обрабатываемой строки?
У вас в параметре value
должно быть задано имя переменной в которую будет передано значение. И к этой переменной можно обратиться как $#value_name_param
.
На что надо обратить внимание, если у нас в одном коде несколько listReplace?
Проверяйте, что у вас не пересекаются имена переменных.
Можно ли добавить элемент с ключом, если мы обрабатываем список единичных значений?
Нет, action
с ключом вида action: "key" = $value
доступен для rowlist
.
Как добавить или заменить элемент с ключом, если мы обрабатываем rowList?
=: listReplace(list: $startlist; action: "price" = $action; value: "value")
startlist: selectRowList(table: 'table'; field: 'num'; field: 'price'; where: 'status' = 4)
action: $#value[price] * $kf
kf: select(table: 'table_2'; field: 'kf'; where: 'num' = $#value[num])
Здесь мы берем rowlist
и корректируем значения в колонке price
. обратите внимание, что в value попдает значение строки списка startlist
, а для rowlist
значение строки это row
— поэтому обращение в $#value
должно дополнятся нужним ключом (колонкой) — $#value[price]
.
Если в action
мы задаем имеющийся в rowlist
ключ, то он будет перезаписан. Если мы укажем ключ, которого нет в стартовом rowlist
, то будет добавлена еще одна колонка с таким ключом.
Как создать основу для перебора при помощи listNumberRange?
Иногда нам нужно создать список основу, по которому мы будем делать перебор. Для этого подходит listNumberRange.
Например создадим список дней от 1 до 31:
=: listNumberRange(min: 1; max: 31; step: 1)
Если для дальнейшей обработки нужен не list
, а rowlist
:
=: rowListCreate(field: "range" = $range)
range: listNumberRange(min: 1; max: 31; step: 1)
Как упростить если требуется произвести однотипное математическое действие над всеми элементами списка?
Если над всеми элементами списка надо произвести однотипную математическую операцию, то для этого есть более простая функция listMath.
```totum =: listMath(list: $list; operator: "*"; num: 3) list: listCreate(item: 1; item: 2; item: 11; item: 21)
// Результат: [ 3, 6, 33, 63]
````