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

用于清理嵌套层的Photoshop/JavaScript脚本。递归函数需要foreach替代方案吗,javascript,recursion,photoshop,Javascript,Recursion,Photoshop,背景:我正在写一个脚本来清理photoshop文档中所有不可见的层。Photoshop层可以分组,组可以嵌套,类似于目录树,所以我使用递归 我遇到的问题是JavaScript中没有foreach函数来迭代集合中的每一层。我用fori=0;iScripts>浏览并选择.jsx文件。这里有许多可能的解决方案: 反向迭代 解决此类问题的一种典型方法是从头到脚迭代数组。这样,当您删除当前正在交互的项时,它不会影响仍然需要迭代的元素的数组位置: for (i=layers.length - 1; i &g

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


我遇到的问题是JavaScript中没有foreach函数来迭代集合中的每一层。我用fori=0;iScripts>浏览并选择.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方法,但在迭代时更改数组并不安全,因此您仍然需要使用其他解决方案。

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

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

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方法,但在迭代过程中更改数组并不安全,因此您仍然需要使用其他解决方案。

有,文档真的很烂。有,文档真的很烂。谢谢!反向迭代非常有效。我开始使用将它们推到新阵列的方法,但这看起来很尴尬。谢谢!反向迭代非常有效。我开始使用将它们推到新阵列的方法,但这似乎很尴尬。