在我们日常操作中,经常会碰到什么时候要用each,什么是要用_,甚至什么时候用(a)=>。
我们先来解释下这几个的意思。
each:从字面意义来讲就是每一个的意思,表达的内容也和字面意义一样。
_:代表当前行,既可以代表当前表的当前行,也可以代表指定列的当前行。如果指表的每一行也就是记录(Record),如果代表列的每一行也就是值(Value)。(直接代表只限当前表)
(a)=>:代表的是一个函数引用,可以替代指定的列表等引用。
我们来看几个案例。
数据源:
代表当前表的当前行_,实际上就是一个Record
代表当前行的指定列_,实际上就是一个值
each的出现基本上伴随着列和表的计算(最终显示结果为列或者表,List.Average这类最终结果是值的排除在外),例如添加列的时候就会自动添加一个each。
使用List.Average之类的函数,因为最终返回的是值,所以也就不存在each的使用。
判断当前成绩是否大于平均成绩=_[成绩]>List.Average(源[成绩])
选择大于等于平均数的值作为列表,则需要使用each,因为返回的结果是list格式。
=List.Select(源[成绩], each _>=List.Average(源[成绩]))
=List.Select(源[成绩], (a)=>a>=List.Average(源[成绩]))
其中的each _代表的是前面源[成绩]这一列的每一行的值(因为list格式只有一行,所以返回的就是其每一个值)。
同理,a代表的也是前面源[成绩]这一列的值
返回Table格式时候使用each。
例如:我们需要选择成绩=100的列表。有时候代表当前字段值的时候,前面的这个_可以省略。
_[成绩]=[成绩]=值
=Table.SelectRows(源,each _[成绩]=100)
=Table.SelectRows(源,each[成绩]=100)
=Table.SelectRows(源,(a)=>a[成绩]=100)
=Table.SelectRows(源,(源)=>源[成绩]=100)
(a)代表的就是源,(源)直接作为变量和(a)意思一样
返回成绩列表每个值+当前成绩列表的行值。
=List.Transform(
源[成绩],(a)=>a+[成绩])
我们再来看一个稍微复杂点的,返回姓名+总分的列表
=List.Transform(源[姓名], (a)=>a & Text.From( List.Sum( 源[成绩] ) ) )
我们要返回的是一个list,同时需要进行运算,所以需要用自定义函数作为一个参数进行运算,使用到的就是(a)=>,代表的是源[姓名],List.Sum进行求和,出来的是一个数值,我们还需要进一步用Text.From进行转换成文本格式,最终2个文本格式进行合并。代表列的源[姓名]和代表值的文本通过&进行合并。
我们可以发现用自定义函数可以替代each_进行列和数值进行对比。在自定义中可以使用任何的变量参数进行使用,不限于a。
另外我们还可以换个角度来辨别,如果存在2个变动的值进行计算或者比较,就必须使用自定义函数参数来进行分类,要不然无法区分对应的到底是哪一行。
对于这块的知识还是需要反复用实例来熟悉掌握。
有时候大家对于变量的指示不是很明确,如果直接使用代表的数据就可以更加容易辨别。当然前提是必须是一个变量值,不能有[]等符号。