Photoshop JavaScript从图层制作数组

时间:2018-08-29 15:59:11

标签: javascript arrays photoshop

这是我的代码:

var doc = app.activeDocument;
var allLayers = new Array;
var allLayers = collectAllLayers(doc, allLayers);

function collectAllLayers (doc, allLayers){
    for (var m = 0; m < doc.layers.length; m++){
        var theLayer = doc.layers[m];
        if (theLayer.typename === "ArtLayer"){
            allLayers.push(theLayer);
        }else{
            collectAllLayers(theLayer, allLayers);
        }
    }
    return allLayers;
}
alert("array_layers : " + allLayers);

我进入这样的警报数组

[Layer1],[Layer2],[Layer3];

我想使它看起来像这样:

[Layer1,Layer2,Layer3];

感谢您的回答和预先的帮助!

5 个答案:

答案 0 :(得分:2)

相关代码已正确运行。参考ArtLayer上的文档,您可以通过为数组中的每个对象打印一些属性来证明这一点:

function collectAllLayers (layerSet, layers){
    for (var i = 0; i < layerSet.layers.length; i++){
        var layer = layerSet.layers[i];

        if (layer.typename === "ArtLayer"){
            layers.push(layer);
        } else {
            collectAllLayers(layer, layers);
        }
    }

    return layers;
}

function printable (artLayers) {
    var layerDescriptions = [];

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

        layerDescriptions.push(
            '{ name: ' + layer.name +
            ', kind: ' + layer.kind +
            ', opacity: ' + layer.opacity +
            ', visible: ' + layer.visible +
            ' }'
        );
    }

    return layerDescriptions;
}

var artLayers = collectAllLayers(app.activeDocument, []);
var layerDescriptions = printable(artLayers);

alert(layerDescriptions);

答案 1 :(得分:1)

问题中的代码显示ArtLayer个对象的单级数组。可能会感到困惑,因为toString对象的ArtLayer方法在方括号中返回图层的名称(在我安装的PS版本(v19.1.5)中,“ ArtLayer”字符串显示在图层之前名称,但仍在方括号内)。例如:

var doc = app.activeDocument;
alert(doc.layers[0]); // Alerts "[ArtLayer Layer 1]"

Alert window

要展宽数组ary可以使用[].concat.apply([], ary),例如:

var ary = [1, ["A", "B", "C"], 3];
alert(ary[2]); // Alerts "3"
alert([].concat.apply([],ary)[2]); // Alerts "B"

答案 2 :(得分:0)

如何使用allLayers.push(theLayer[0]);代替allLayers.push(theLayer);

答案 3 :(得分:0)

您是否尝试过将列表平放在递归结果中?

var doc = app.activeDocument;
var allLayers = new Array;
var allLayers = collectAllLayers(doc, allLayers);

function collectAllLayers (doc, allLayers){
    for (var m = 0; m < doc.layers.length; m++){
        var theLayer = doc.layers[m];
        if (theLayer.typename === "ArtLayer"){
            allLayers.push(theLayer);
        }else{
            flatten(collectAllLayers(theLayer, allLayers));
        }
    }
    return flatten(allLayers);
}

function flatten(arr) {return arr.reduce(
  (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
)};

alert("array_layers : " + allLayers);

答案 4 :(得分:-2)

您可以使用

const flatten = (layers, allLayers) => layers.reduce((acc,layer) => (Array.isArray(layer)) ? collectAllLayers(layer, acc) : acc.push(layer), allLayers);

const collectAllLayers = (doc, allLayers) => flatten(doc.layers, allLayers);