pdi*_*izz 1 javascript photoshop recursion
背景:我正在编写一个脚本来清理photoshop文档中的所有不可见图层.Photoshop图层可以分组,组可以嵌套,类似于目录树,所以我使用递归.
我遇到的问题是JavaScript中没有foreach函数来遍历集合中的每个层.我使用了for(i=0; i<layers.length; i++)etc,但每次删除图层时都会更改图层的索引并最终失败.我通过将每个图层推送到一个新数组并使用另一个for循环删除它来修复此问题.我在删除空组时遇到了同样的问题.
无论如何,我有*半工作功能,但它看起来像一团糟.我尝试使用for-in循环,但它循环遍历.length和.parent等属性而不是实际的层.在这种情况下是否有适用的foreach替代方案?我是否需要运行两个单独的递归函数来删除图层然后删除空组?谢谢!
如果您不熟悉在photoshop中运行脚本,只需选择"文件">"脚本">"浏览",然后选择.jsx文件.
这里有许多可能的解决方案:
解决这类问题的一种典型方法是将数组从末尾迭代到前端.这样,当您删除当前正在进行交互的项目时,它不会影响您仍需要迭代的元素的数组位置:
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()方法,但是在迭代时更改数组是不安全的,所以你仍然必须使用其他一些解决方案.