用于清理嵌套图层的Photoshop/JavaScript脚本.需要foreach替代递归函数

pdi*_*izz 1 javascript photoshop recursion

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

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

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

这是半工作脚本.

和一个示例.psd文档.

如果您不熟悉在photoshop中运行脚本,只需选择"文件">"脚本">"浏览",然后选择.jsx文件.

jfr*_*d00 6

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

向后迭代

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

for (i=layers.length - 1; i >= 0; i--)
Run Code Online (Sandbox Code Playgroud)

制作数组的静态副本

另一种可能性是制作数组的副本,以便在删除图层时使用静态副本进行迭代:

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

累计要删除的项目

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

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];
}
Run Code Online (Sandbox Code Playgroud)

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