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

标签 javascript freemarker ecmascript-5 nashorn magnolia

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

列表

[#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();

关于javascript - 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60269057/

相关文章:

JavaScript、构造函数和 "this"

javascript - 处理返回 promise 或空值的函数

javascript - 在没有 defineProperty 的情况下覆盖对象 getter

javascript - 如何防止两个组件重叠

java - Spring Boot 应用程序无法使用 JspTagLib 和 Freemarker 找到 security.tld

java - 如何在 Freemarker DropWizard 中使用按钮调用方法

javascript - 如何在 Freemarker 模板或 javascript 中以特定格式转换日期

javascript - AngularJS 中有 ng-bind-html 的 Ready 函数吗?

javascript - Vuejs Router,JavaScript代码的条件加载

javascript - Liferay portlet 在门户中无法识别