javascript - 用于清理嵌套层的 Photoshop/JavaScript 脚本。需要 foreach 递归函数的替代方案

标签 javascript recursion photoshop

背景:我正在编写一个脚本来清理 photoshop 文档中的所有不可见层。 Photoshop 层可以分组,组可以嵌套,类似于目录树,所以我使用递归。

我遇到的问题是 JavaScript 中没有 foreach 函数来遍历集合中的每一层。我用了for(i=0; i<layers.length; i++)等等,但每次我删除一个图层时,它都会更改图层的索引并最终失败。我通过将每一层推送到一个新数组并用另一个 for 循环删除它们来解决这个问题。我在删除空组时遇到了同样的问题。

无论如何,我有一个*半工作功能,但它看起来一团糟。我尝试使用 for-in 循环,但它循环遍历 .length 和 .parent 等属性,而不是实际层。是否有适用于这种情况的 foreach 替代方案?我是否需要运行两个单独的递归函数来删除图层然后删除空组?谢谢!

Here is the semi-working script.

And a sample .psd document.

如果您不熟悉在 photoshop 中运行脚本,只需选择"file">“脚本”>“浏览”并选择 .jsx 文件。

最佳答案

这里有很多可能的解决方案:

向后迭代

解决此类问题的一种典型方法是从末尾到前面迭代数组。这样,当您删除当前正在交互的项目时,它不会影响您仍需要迭代的元素的数组位置:

for (i=layers.length - 1; i >= 0; i--)

制作数组的静态副本

另一种可能性是制作数组的副本,以便您有一个静态副本来迭代,当层被删除时不会被修改:

var staticLayersArray = Array.prototype.slice.call(layers);
for (i=0; i < staticLayersArray.length; i++) {
    // process staticLayersArray[i]
}

累积要删除的项目

您可以遍历数组并累积要删除的项目,并且仅在完成迭代后才删除它们:

var layersToDelete = [];
for (i=0; i < layers.length; i++) {
    if (we need to delete this item) {
        layersToDelete.push(layers[i]);
    }
}
// after the iteration, process the deletions
for (i = 0; i < layersToDelete.length; i++) {
    // remove the layer layersToDelete[i];
}

仅供引用,javascript 数组的现代实现确实有一个 .forEach() 方法,但是在迭代时更改数组是不安全的,因此您仍然必须使用其他一些解决方案。

关于javascript - 用于清理嵌套层的 Photoshop/JavaScript 脚本。需要 foreach 递归函数的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606735/

相关文章:

javascript - 重复调用函数,直到其 Promise 得到解决或达到设定的超时时间

javascript - 用 Canvas 绘制的星爆形状看起来非常像素化(锯齿)

javascript - 基于跟踪代码管理器事件的动态 Google Analytics 事件

c++ - 计算序列的第 n 项。为什么我会收到编译器错误?

recursion - 在 Groovy 中递归列出与特定文件类型匹配的所有文件

javascript - 在 Angular html View 中加载外部脚本

c - C 递归过程中的递归调用

ios - 如何从 Photoshop 获取正确的字体大小到 iOS

css - 为什么在 Photoshop 网页设计模板中常用矢量和图层蒙版?

xcode - 我如何在 Xcode StoryBoard 中像 Photoshops 一样使用 'Lock Selection'