使用 LAMBDA 作为 FILTER 的第二个参数

Lio*_*owe 7 excel excel-formula office365

在 Excel 中,我可以轻松地将 aLAMBDA作为第二个参数传递给MAP,如预期的那样:

\n
=MAP({1, 2, 3}, LAMBDA(x, x = 1))\n// { TRUE, FALSE, FALSE }\n
Run Code Online (Sandbox Code Playgroud)\n

如果我尝试对 执行相同的操作FILTER,则会收到错误:

\n
=FILTER({1, 2, 3}, LAMBDA(x, x = 1))\n// #CALC!\n
Run Code Online (Sandbox Code Playgroud)\n

我有几个相关问题:

\n
    \n
  1. 实际上是否有某种方法可以使用 LAMBDA 作为我缺少的第二个参数?
  2. \n
  3. FILTER 的官方文档没有提及参数 \xe2\x80\x94 的类型或任何限制,它只是说“基于您定义的标准”。在哪里可以找到明确提供此类信息的 Excel 公式文档(例如“第 n 个参数必须是字符串”、“必须是以 R1C1 格式给出的绝对引用”、“必须是 -283 到 87845 之间的数字”、“必须是单元格范围而不是数组文字”,“必须是单元格范围或数组文字,但由于某种原因不是数组单元格引用”,等等)
  4. \n
  5. 如果我不能使用 LAMBDA,我将如何过滤数组文字?
  6. \n
  7. Microsoft 是否有任何路线图来发布如此明显有用的功能,这些功能将提供一致的 API,MAP并且FILTER任何理智的人都会期望?
  8. \n
\n

如果我听起来很咸,那是因为我很咸

\n

Jvd*_*vdV 5

是的,你可以,但你必须知道 lambda 辅助函数MAP()和实际LAMBDA()函数之间的区别。

\n
\n

语法MAP()

\n
=MAP(array1, lambda_or_array<#>)\n
Run Code Online (Sandbox Code Playgroud)\n

Map 是一个内置的 lambda 帮助器,由于唯一的功能是在迭代计算中应用 lambda,因此您可以应用=MAP({1,2,3},LAMBDA(x,x=1)).

\n
\n

LAMBDA()根据官方文档在单元格中创建的语法:

\n
=LAMBDA([parameter1, parameter2, ...],calculation)(function call)\n
Run Code Online (Sandbox Code Playgroud)\n

这里的区别在于,对于实际的 lambda,您仍然应该创建自己的自定义函数MAP()为此,语法有点不同,与等内置函数形成对比REDUCE();您仍然需要以某种方式包含输入。这是通过函数末尾的一组额外括号来完成的:=LAMBDA(x,x=1)({1,2,3}).\xc2\xb9

\n
\n

现在我们知道,使用内置 lambda-helpers,输入是函数语法中的实际参数,我们可以将两者应用到您的FILTER()

\n
=FILTER({1,2,3},MAP({1,2,3},LAMBDA(x,x=1)))\n
Run Code Online (Sandbox Code Playgroud)\n

或者\xc2\xb2:

\n
=FILTER({1,2,3},LAMBDA(x,x=1)({1,2,3})\n
Run Code Online (Sandbox Code Playgroud)\n

看看这个MAP()功能如何让生活变得更轻松一些?人们还可以LAMBDA()根据下面的脚注创建自己的自定义函数并调用它:

\n
=FILTER({1,2,3},TEST({1,2,3})\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xc2\xb9人们通常会在名称管理器中创建一个自定义的名为 lamda 函数。在这种情况下,您不需要在末尾包含源代码,而是调用包含第一个参数中的输入的函数。例如:调用的自定义命名函数TEST()引用了调用时=LAMBDA(x,x=1)会输出的内容。{TRUE,FALSE,FALSE}=TEST({1,2,3})

\n

\xc2\xb2如果您确实想使用数组文字,请考虑合并LET()以便能够首先将数组放入命名变量中。例如:=LET(x,{1,2,3},FILTER(x,LAMBDA(y,y=1)(x))).

\n

  • 这确实是一个绝妙的解释:-)关于你的脚注2:这不是太复杂了吗?`=LET(x,{1,2,3},FILTER(x,x=1))` 将在没有 LAMBDA 的情况下完成这项工作。 (2认同)
  • @Ike,是的,你可以,但“x=1”绝对是最简单的计算。如果这么简单,请跳过“LET()”。我发现“LAMBDA()”的美妙之处在于,您可以在第二个参数中进行任何类型的计算,包括调用其他函数等。在这种情况下,我总是使用“LET()”。 (2认同)

Ike*_*Ike 1

要回答你的第三个问题:你可以使用这个公式:

=LAMBDA(x,FILTER(x,x=2))({1,2,3})
Run Code Online (Sandbox Code Playgroud)

或者 - 如果您想保留列:

=BYCOL({1,2,3},LAMBDA(x,FILTER(x,x=2,"")))
Run Code Online (Sandbox Code Playgroud)

对第一个版本的增强以传递过滤器值:

=LAMBDA(arrValues, filterBy, FILTER(arrValues,arrValues = filterBy))({1,2,3};3)
Run Code Online (Sandbox Code Playgroud)