Extendscript:如何在for循环中跳过当前迭代?

时间:2014-11-22 21:41:06

标签: javascript extendscript

我有以下代码,用ExtendScript编写,用于处理After Effects合成中的一系列图层:

   for (var i=0; i < selectedLayers.length; i++) {
        var layer = selectedLayers[i];
        if (!layer.hasVideo || !layer.enabled) {
             //Go for the next one
             continue;
             }
        //Do stuff
        }

如果某个元素未启用或其中没有视频,则循环应该跳过它;如果确实如此,则应该进行处理。

现在,如果没有满足"if"检查的元素,但是如果一个元素完成了那个检查......那么循环就会在下一次迭代中停滞不前。那就是:想象一下i = 2处的元素是否没有视频。 “继续”被执行......然后,循环无限期地停留在i = 3并且永远不会结束。

为什么会这样?我认为“继续”正是在Javascript / Extendscript中跳过循环迭代的指令。发生了什么事?

编辑:根据要求,这是我的整个代码。也许我在其中一个嵌套的“if”中遗忘了一个大括号...但在这种情况下,代码如何在某些情况下起作用而在其他情况下不起作用?

var nombreDelPlugin="Denoiser II";

var rutaRender="/Users/paulj";

var activeItem = app.project.activeItem;
if ((activeItem == null) || !(activeItem instanceof CompItem)) {
    alert("Please select or open a composition first.");
    }
else {
    var selectedLayers = activeItem.selectedLayers;
    if (activeItem.selectedLayers.length == 0) {
        alert("Please select at least one layer in the active comp first.");
        }
    else {
        var comp = app.project.activeItem;
        var width=comp.width;
        var height=comp.height;
        var par=comp.pixelAspect;
        var fps=comp.frameRate;

        var tempFolder = comp.parentFolder.items.addFolder(comp.name + " - Temp Comps");
        var ClipsAnadidos=Array();
        var nombresUsados={};

        for (var i=0; i < selectedLayers.length; i++) {
            alert("Mooo: " + i);
            var layer = selectedLayers[i];
            if (!layer.hasVideo || !layer.enabled) {
                    alert("Meeept: " + i);
                    continue;
                   }
  /*          if (!esFootage(layer)) {
                alert("Meeept: " + i);
                break;
                }
*/
            //¿Hemos renderizado ya este layer? Si es así, nos lo saltamos.
            var original=layer.source;
            if (inArray(original, ClipsAnadidos) > 0) {
                continue;
                }
           ClipsAnadidos.push(original);

           //¿Hay otra comp ya con este mismo nombre?
           var vecesUsado=nombresUsados[original.name];
           if (!vecesUsado) { vecesUsado=0; }
            var nombre= original.name + "_" + vecesUsado;
            nombresUsados[original.name]=vecesUsado + 1;

            //Creamos la nueva comp con el clip dentro
            var newcomp=app.project.items.addComp(nombre, width, height, par, original.duration, fps);
            var newlayer=newcomp.layers.add(original, original.duration);
            newcomp.parentFolder=tempFolder;

            //Si la escala no es 100, usamos la de la comp original
            if ((layer.scale.value[0] != 100) || (layer.scale.value[1] != 100)) {
                newlayer.scale = layer.scale.value;
                }

            var denoise = newlayer.property("Effects").addProperty(nombreDelPlugin);

            //Añadimos al render queue, y establecemos la ruta de salida
            var rqi = app.project.renderQueue.items.add(newcomp);
            var om = rqi.outputModule(1);                               // Assumes at least one output module
            om.file=new File(rutaRender + "/" + original.name);
            }
        }
    }



function esFootage(lay) {
    if (lay.source instanceof FootageItem) {
        //alert(lay.name + " es footage");
        if (lay.source.mainSource instanceof SolidSource) { return false; }
        else { return true; }
        }
    if (lay.source instanceof CompItem) {
        return true;
        }
    else { return false; }
    }


function inArray(v, arr) {
    for (i=0; i < arr.length; i++) {
        if (arr[i] == v) { return i; }
        }
    return -1;
    }

1 个答案:

答案 0 :(得分:0)

这对我来说很好用:

var selectedLayers = [
  {hasVideo: true, enabled: true},
  {hasVideo: true, enabled: true},
  {hasVideo: true, enabled: false},
  {hasVideo: true, enabled: true},
  {hasVideo: false, enabled: true}
];

for (var i=0; i < selectedLayers.length; i++) {
  var layer = selectedLayers[i];

  if (!layer.hasVideo || !layer.enabled) {
    //Go for the next one
    continue;
  }

  //Do stuff
  console.log(i);
}

它会跳过24并输出:

0 
1 
3 


如果你在循环中有一个循环,那么内部i可能正在被重置,在这种情况下你必须在循环之外定义它。