首页 > 解决方案 > 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

问题描述

我试图在Magnolia JavaScript 模型中使用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实现的。

Nashorn JavaScript 引擎首先通过 JEP 174 并入 JDK 8,作为 Rhino 脚本引擎的替代品。发布时,它是 ECMAScript-262 5.1 标准的完整实现。— JEP 335:弃用 Nashorn JavaScript 引擎

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

标签: javascriptfreemarkerecmascript-5nashornmagnolia

解决方案


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

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

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

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

new Model();

推荐阅读