0

我正在为 Premiere pro 编写脚本,我可以在时间轴中添加标记并一次性为每个标记导出静止图像。但是,当我编写一个函数来检查之前是否已经创建了静止图像时,这些函数告诉我它找到了以前创建的静止图像,但仍然会创建一个新的静止图像。所以基本上:函数返回 true,但仍然执行 else{}

    //checks if the frame that is about to be exported already exists 
        if(checkIfExist(app.project.rootItem, outputFile)){
            alert("frame already exists");
        }else{
        //This is where the actual still gets created and imported
            activeSequence.exportFramePNG(time, outputFileName);
        //here the previously created item gets moved to the appropriate bin (This is working great ATM)
            moveToBin(outputFile);
       }
    }
}
//This function is meant to check if an item exists in the project bin. It does this by looping though all the items in the array from the start. 
function checkIfExist(currentItem, name){
    for(var i = 0; i<currentItem.children.numItems; i++){
        currentChild = currentItem.children[i];
        if(currentChild.name.toUpperCase() === name.toUpperCase()){
            alert("Found:   " + currentChild.name);
            return true;
        }if(currentChild.type == ProjectItemType.BIN){
            checkIfExist(currentChild, name);
        }
    }
    return false;
}
4

1 回答 1

0

我认为这是因为你做的递归:

 if(currentChild.type == ProjectItemType.BIN){
            checkIfExist(currentChild, name);
 }

如果这个函数在你返回 true 之前被启动,你将开始第二次运行这个函数。

现在第一次运行可以返回 true,而第二次(甚至是第 3 次或第 4 次等)可以返回 false,从而创建一个新的,同时也找到它。

此外,如果可能,请尝试使用 arr.find 或 arr.findIndex 并检查该值是否为 -1(或未找到)。这将使您的代码更短、更清晰、更容易出错 :)

但这不适用于嵌套数组。然后,在执行 arr.find 或 arr.findIndex 之前,您需要先创建一个包含所有嵌套数组的平面副本。仍然认为这是更好的解决方案。

您可以使用它来将嵌套数组变成一个平面数组:

let arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];

function flattenDeep(arr1) {
   return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
flattenDeep(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
于 2019-08-13T14:25:26.983 回答