Почему Array.prototype.filter () выдает ошибку в моделях Magnolia JavaScript? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь отфильтровать список FreeMarker в 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 был впервые включен в JDK 8 через JEP 174 в качестве замены для скриптовый движок Rhino Когда он был выпущен, это была полная реализация стандарта ECMAScript-262 5.1. - JEP 335: устарел Nashorn JavaScript Engine

Почему, несмотря на то, что Nashorn следует ECMAScript-262 5.1, я получаю ошибку при использовании Array.prototype.filter()?

1 Ответ

1 голос
/ 17 февраля 2020

Список 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();
...