如何减少 Magnolia JavaScript 模型中的列表?

How do I reduce a list in a Magnolia JavaScript model?

我正在尝试减少 Magnolia JavaScript model 中的 FreeMarker 列表。我想要所有以大写 "P".

开头的项目
[#assign list = ["Poker", "Pet", "Dog", "Cat", "Penguin", "Paddle", "punk"]]

我的函数应该return:

["Poker", "Pet", "Penguin", "Paddle"]

尝试次数

我尝试使用 Array.prototype.reduce()

var Model = function() {
  this.reduceList = function(list) {
    return list.reduce(function(reducedList, item) {
      if (item.indexOf('P') !== -1) {
        reducedList.push(item);
      }
      return reducedList;
    }, []);
  }
};

new Model();
[#assign filteredList = model.reduceList(['Poker', 'Pet', 'Dog', 'Cat', 'Penguin', 'Paddle', 'punk'])]

但是,我收到以下错误。

jdk.nashorn.internal.runtime.ECMAException: TypeError: list.reduce is not a function

注意: Magnolia JavaScript 模型基于 Nashorn.

调试

当我return列表的类型时:

this.reduceList = function(list) {
  return typeof list;
}

我得到一个对象:

object

当我return列表为字符串时:

this.reduceList = function(list) {
  return list.toString();
};

我得到一个列表:

[Poker, Pet, Dog, Cat, Penguin, Paddle, punk]

如何减少 Magnolia JavaScript 模型中的列表?

使用filter()方法。这是一个代码示例:

var Model = function() {
  this.reduceList = function(list) {
    return Java.from(list).filter(function(item) {
      return item[0] === 'P'
    });
  }
};

JavaScript returns object 中的 typeof 运算符用于数组值 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof).

当您调用 toString() 时,您只是打印出您拥有的数组的值。

此外,Prasana Kannan 是正确的。这不是 reduce 的好用法。 Reduce 用于 return 一组值中的一个值 (https://engineering.khanacademy.org/posts/lets-reduce.htm). Using filter would be more elegant here (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter).

至于为什么 reduce 不被识别为函数,您可能需要查看您的 Nashorn 版本,看看它是否包含 reduce 的实现。