背景:我正在编写一个脚本来清理 photoshop 文档中的所有不可见层。 Photoshop 层可以分组,组可以嵌套,类似于目录树,所以我使用递归。
我遇到的问题是 JavaScript 中没有 foreach 函数来遍历集合中的每一层。我用了for(i=0; i<layers.length; i++)
等等,但每次我删除一个图层时,它都会更改图层的索引并最终失败。我通过将每一层推送到一个新数组并用另一个 for 循环删除它们来解决这个问题。我在删除空组时遇到了同样的问题。
无论如何,我有一个*半工作功能,但它看起来一团糟。我尝试使用 for-in 循环,但它循环遍历 .length 和 .parent 等属性,而不是实际层。是否有适用于这种情况的 foreach 替代方案?我是否需要运行两个单独的递归函数来删除图层然后删除空组?谢谢!
Here is the semi-working script.
如果您不熟悉在 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/