Skip to main content
Andre Nguyen
Inspiring
August 7, 2024
Answered

How to improve this script performance? Get all layers id

  • August 7, 2024
  • 2 replies
  • 390 views

I use this script to get all layer ids, then use the array to select the next or previous layer based on the id, but the performance is too slow. Is there any way to improve this script? Please help!

 

function getAllLayerIds(layers = app.activeDocument.layers, layerIdArray = []) {
    for (const layer of layers) {
        layerIdArray.push(layer._id); // Push the layer's ID
        // Check if the layer has children (sublayers)
        if (layer.layers && layer.layers.length > 0) {
            getAllLayerIds(layer.layers, layerIdArray); // Recursive call
        }
    }
    return layerIdArray;
}

 

 

 
This topic has been closed for replies.
Correct answer Andre Nguyen

I've solved the problem ^^

 layerProperties = {
        _obj: "multiGet",

        _target: { _ref: [{ _ref: "document", _enum: "ordinal" }] },

        extendedReference: [["name", "layerID", "parentLayerID", "itemIndex", "group", "layerKind"], { _obj: "layer", index: 1, count: -1 }],
        options: { failOnMissingProperty: false, failOnMissingElement: false },
    };

    result = await require("photoshop").action.batchPlay([layerProperties], {});

    // filter out member which contains name === "</Layer group>"
    let layerIds = result[0].list.filter((layer) => layer.name !== "</Layer group>");

    return layerIds.map((layer) => layer.layerID);

 

2 replies

Andre Nguyen
Andre NguyenAuthorCorrect answer
Inspiring
August 7, 2024

I've solved the problem ^^

 layerProperties = {
        _obj: "multiGet",

        _target: { _ref: [{ _ref: "document", _enum: "ordinal" }] },

        extendedReference: [["name", "layerID", "parentLayerID", "itemIndex", "group", "layerKind"], { _obj: "layer", index: 1, count: -1 }],
        options: { failOnMissingProperty: false, failOnMissingElement: false },
    };

    result = await require("photoshop").action.batchPlay([layerProperties], {});

    // filter out member which contains name === "</Layer group>"
    let layerIds = result[0].list.filter((layer) => layer.name !== "</Layer group>");

    return layerIds.map((layer) => layer.layerID);

 

Andre Nguyen
Inspiring
August 7, 2024

This function only took <200 ms for more than 2500 layers, which is significantly faster than my previous function.

Andre Nguyen
Inspiring
August 7, 2024

I forgot to mention, I'm using UXP