# 在Logic App中使用内联脚本获取最新的数组项

在我的上一篇文章 (opens new window)中,通过组合使用Select动作 (opens new window)Filter动作 (opens new window),我们已经了解了如何使用Logic App (opens new window)工作流来获取一个数组中的最新的项。事实上,虽然这种做法是可行的,但它仅适用于一些特定的使用情况,对大多数情况来说,这个解决方案有点棘手。但是,有一个预览功能:内联 JavaScript 代码动作 (opens new window),可以方便地对数组排序。在这篇文章中,我将讨论如何使用内联 JavaScript 代码动作 (opens new window)排序数组项,并获取 Logic App 工作流中的最新的项。

# 集成账户

为了使用这个内联 JavaScript 代码动作,我们必须提供一个集成账户 (opens new window)实例。集成帐户有三种定价层 (opens new window) - 免费、基本和标准。对于我们的例子来说,免费的已经足够了。

一旦提供了集成帐户实例,将其与现有的 Logic App 实例连接起来以使用动作。

img

# JavaScript 支持

目前,该动作仅支持 node.js 8.11.1内置函数 (opens new window)。我们无法通过npm导入外部库。因此,我们不能依赖于任何require() (opens new window)语句。所有内容必须被包含在该动作中。

# 内联 JavaScript 代码

让我们来看看下面的 JavaScript 代码。它不涉及 Logic App,只是纯 JavaScript 代码。如果您在 node.js 的控制台运行这段代码,它将返回20191104.json最新的文件路径值,这也是预期的值。 JavaScript 的数组排序功能 (opens new window)需要一个单独的回调函数,其中包含排序逻辑。

"use strict";

var items = [
  {
"Name": "20191101.json",
"Path": "/path/20191101.json"
  },
  {
"Name": "20191102.json",
"Path": "/path/20191102.json"
  },
  {
"Name": "20191103.json",
"Path": "/path/20191103.json"
  },
  {
"Name": "20191104.json",
"Path": "/path/20191104.json"
  }
];

var sorted = items.sort(function (a, b) {
var dateA = a.Name.replace('.json', '');
var dateB = b.Name.replace('.json', '');

// dateA is later than dateB: dateA gets the lower index.
if (dateA > dateB) {
return -1;
  }

// dateA is older than dateB: dateB gets the lower index.
if (dateA < dateB) {
return 1;
  }

// dateA and dateB is the same
return 0;
});

var result = sorted[0].Path;

console.log(result);

回调函数应该返回-101

  • 返回 -1 表示,在数组元素 ab 中,a 会被排列到 b 之前。
  • 返回 1 表示 b 会被排列到 a 之前。

因此,回调函数把 abName 属性值去掉 .json,将这两个值进行相互比较,较大的值位于数组项的上部位置(即较低的索引)。换句话说,数组项以降序进行排序。

如果你想知道更多有关排序的信息,请参考此页面 (opens new window)

现在,让我们将这个代码应用到 Logic App。

# 内联 JavaScript 代码动作

让我们添加一个内嵌JavaScript代码 (opens new window)动作。

img

然后进入动作的 JavaScript 代码。这几乎等同于上面的例子,但有两个地方有所不同。

"use strict";


// Assign the array value from the output of the previous action, `List Backups`.
var items = workflowContext.actions.List_Backups.outputs.body.value;


var sorted = items.sort(function (a, b) {
  var dateA = a.Name.replace('.json', '');
  var dateB = b.Name.replace('.json', '');


  if (dateA > dateB) {
    return -1;
  }


  if (dateA < dateB) {
    return 1;
  }


  return 0;
});


var result = sorted[0].Path;


// Returns the result as output.
return result;
  • items 变量获取上一个操作——List Backups的输出值作为数组项。
  • 在最后一行,它使用了 return 语句把动作的结果发送到 outputs 值。

如果我们想引用这个动作的结果,这个工作流中的任何之后的动作都可以使用outputs('ACTION_NAME')?['body']

# 比较

现在,我们只使用这种内联 Javascript 代码动作来解决排序问题。让我们来比较一下相同的结果,请参考上一篇文章 (opens new window)与下面的图片。

img

右侧是我们在上一篇文章 (opens new window)中创建的。至少我们应该同时使用从备份中选择文件名动作(Select)和获取最新备份动作(Filter)。如果我们希望有一个更优雅的方式,需要在之前和之后有一些额外的动作。

另一方面,如果我们使用内联 JavaScript 代码动作 (opens new window),如左侧所示,我们只需要一个动作。

但有一点需要注意。我们必须有与使用该内联代码动作相关联的集成账户 (opens new window)。集成账户的固定价格相当昂贵——US$ 302.4 (基本) and US$ 986.4 (标准) 每月 (opens new window)。如果您的组织已经使用集成帐户,那没问题。然而,如果还没有,您应该非常小心您的账单。


到目前为止,我们已经了解如何使用内嵌 JavaScript 代码动作 (opens new window)在 Logic App 工作流内排序数组项。它功能强大,但价格昂贵。因此,只有当您的组织能够负担成本时,再使用它。