【问题标题】:Why does Array.prototype.filter() throw an error in Magnolia JavaScript models?为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?
【发布时间】:2020-06-01 18:36:39
【问题描述】:

我正在尝试使用 Array.prototype.filter() 过滤 Magnolia JavaScript model 中的 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 实现的。

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

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

【问题讨论】:

  • 无论list 是什么,它都不能提供mapfilterreduce 方法
  • FreeMarker 可能正在创建一个ArrayList
  • 因为列表可能不是数组。
  • @Pointy 当我转储 (${cmsfn.dump(list, 3, true)}) list 的值时,我得到一个 Java Sequence。现在,为什么我不能使用 map、filter 和 reduce 是有道理的。
  • @Pointy 感谢您的帮助。我回答了我自己的问题:stackoverflow.com/a/60269352/11809808

标签: javascript freemarker ecmascript-5 nashorn magnolia


【解决方案1】:

您传递给模型的 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2016-01-04
    • 2022-12-31
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多