如何在Indesign脚本中使用像Array.reduce()这样的高阶函数?

Jac*_*eam 5 javascript arrays extendscript adobe-indesign

我已经开始了一个项目,我需要使用Adobe Indesign和ExtendScript以编程方式从一系列INDD文件中提取一些数据.的Javascript用于这些程序的脚本的版本不支持任何的,我已经习惯了高阶函数使用(Array.reduce(),Array.forEach(),Array.map(),等...).

有没有办法将此功能添加到ExtendScript?我觉得我在一个四英尺高的天花板的房间里走来走去.

Jac*_*eam 6

使用Polyfill

ExtendScript似乎支持纯Javascript对象(但不是Indesign DOM对象)的原型设计,因此可以使用polyfill添加缺少的功能.可以在"Polyfill"下的方法页面上的MDN上找到Polyfill代码.这是一个例子:MDN Array.prototype.reduce()Polyfill.有众多的方法,包括polyfills Array.map(),Array.indexOf(),Array.filter(),和Array.forEach().

要实现代码,只需在与脚本相同的文件夹中创建一个适当命名的文件(即polyfill.jsreduce.js).将polyfill代码从MDN复制到刚刚创建的文件中,如下所示:

// Production steps of ECMA-262, Edition 5, 15.4.4.21
// Reference: http://es5.github.io/#x15.4.4.21
if (!Array.prototype.reduce) {
  Array.prototype.reduce = function(callback /*, initialValue*/) {
    'use strict';
    if (this == null) {
      throw new TypeError('Array.prototype.reduce called on null or undefined');
    }
    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' is not a function');
    }
    var t = Object(this), len = t.length >>> 0, k = 0, value;
    if (arguments.length == 2) {
      value = arguments[1];
    } else {
      while (k < len && !(k in t)) {
        k++; 
      }
      if (k >= len) {
        throw new TypeError('Reduce of empty array with no initial value');
      }
      value = t[k++];
    }
    for (; k < len; k++) {
      if (k in t) {
        value = callback(value, t[k], k, t);
      }
    }
    return value;
  };
}
Run Code Online (Sandbox Code Playgroud)

然后在脚本开头添加以下行,相应地替换文件名:

#include 'polyfill.js';
Run Code Online (Sandbox Code Playgroud)

该行末尾的分号未包含在Adobe文档中,但我发现有时ExtendScript会在出现错误时抛出错误,尤其是在您#include多次使用时.

  • 在github上与其他具有相同问题的人共享你的polyfill.js会很有帮助. (2认同)