Здесь скорее
PooHkrd ушел на уровень нирваны
Суть в следующем.
Когда мы делаем Table.TransformColumns, у нее два главных аргумента - это имя таблицы и операция преобразования в виде {имя столбца, функция преобразования, тип результата}
Если мы одновременно преобразовываем несколько столбцов, там будет уже такой вид, как список списков: {{имя 1, функция 1, тип результата 2}, {имя 2, функция 2, тип результата 2}}
Если функция одинаковая, то вот этот список списков (имя-функция-тип) можно генерировать из списка названий столбцов
соответственно вот этот кусочек
Код |
---|
List.Transform(
{"Время снимка (план)", "Время снимка (факт)"},
each
{
_,
(x)=>
let
t = List.Transform(Text.Split(x, ":"),Number.From)
in
#duration(0, 0, t{0}, t{1}),
type duration
}
) |
из списка имен {"Время снимка (план)", "Время снимка (факт)"} создает список вида
Код |
---|
{
{"Время снимка (план)", функция, тип},
{"Время снимка (факт)", функция, тип}
} |
Это преобразование делается путем замены (List.Transform) в исходном списке имен столбцов
конкретного имени столбца на список {имя, функция, тип}
Код |
---|
each {_, (x)=>тело функции, тип результата} |
означает: для каждого элемента _ исходного списка преобразуй его в вот такой список из самого элемента, функции и типа.
Эта пресловутая функция потом применяется при преобразовании столбца. Де-факто, это такой же List.Transform:
Код |
---|
(x)=>
let
t = List.Transform(Text.Split(x, ":"),Number.From)
in
#duration(0, 0, t{0}, t{1}) |
означает: для каждого элемента списка (значения столбца):
- сделай разбиение по ":"
- преобразуй каждый кусочек в число
- запомни получившийся список из 2 элементов как t
- получи duration как 0 дней, 0 часов, t{0} минут, t{1} секунд
вообще конструкция let тут не обязательна, но она немного ускоряет выполнение.
Все то же самое можно было записать как
Код |
---|
(x)=>#duration(0, 0, List.Transform(Text.Split(x, ":"),Number.From){0},List.Transform(Text.Split(x, ":"),Number.From)t{1}) |
но зачем дважды делить и преобразовывать, если это можно сделать один раз?
Цитата |
---|
ivanka написал: - почему для секунд t{1}, а не t{0}? |
минуты как t{0} - потому что в списке элементы нумеруются от 0.
Цитата |
---|
ivanka написал: - не понимаю почему мы ничего не пишем внутри этой функции, для меня это как указать функцию ЕСЛИ() без аргументов внутри. |
В данном конкретном случае можно указывать функцию, принимающую единственный аргумент, без указания аргументов.
Три эквивалентных записи
Код |
---|
List.Transform(list, Number.From)
List.Transform(list, each Number.From(_))
List.Transform(list, (x)=>Number.From(x)) |
Причины, почему так можно делать, довольно любопытные, но выходят за рамки ответа