簡體   English   中英

擴展腳本:如何跳過for循環中的當前迭代?

[英]Extendscript: how to skip current iteration in a for loop?

我有以下代碼,用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處的元素沒有視頻。 執行“ continue”(繼續)……然后,循環無限期地停留在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;
    }

這對我來說很好:

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正在重置,在這種情況下,您必須在循環之外定義它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM