为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

Why does Array.prototype.filter() throw an error in Magnolia JavaScript models?

我正在尝试过滤 Magnolia JavaScript model using Array.prototype.filter() 中的 FreeMarker 列表。

列表

[#assign list = [1, 2, 3]]

型号

var Model = function() {
  this.filterList = function(list) {
    return list.filter(function(item) {
      return item === 2
    });
  }
};

new Model();

用法

${model.filterList(list)}

但是,我收到以下错误。

Caused by: jdk.nashorn.internal.runtime.ECMAException: TypeError: list.filter is not a function

Nashorn 是使用 ECMAScript-262 5.1 实现的。

The Nashorn JavaScript engine was first incorporated into JDK 8 via JEP 174 as a replacement for the Rhino scripting engine. When it was released, it was a complete implementation of the ECMAScript-262 5.1 standard. — JEP 335: Deprecate the Nashorn JavaScript Engine

为什么尽管 Nashorn 遵循 ECMAScript-262 5.1,但我在使用 Array.prototype.filter() 时还是会出现错误?

您传递给模型的 FreeMarker 列表是 sequence,而不是 JavaScript 数组。

Sequence (3)
  0 = 1 (BigDecimal)
  1 = 2 (BigDecimal)
  2 = 3 (BigDecimal)

要解决此问题,请使用 Java.from() 将您传递给模型的 FreeMarker 列表转换为 JavaScript 数组。例如:

var Model = function() {
  this.filterList = function(list) {
    return Java.from(list).filter(function(item) {
      return item === 2
    });
  }
};

new Model();