这是我的代码:
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];
感谢您的回答和预先的帮助!
答案 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]"
要展宽数组,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);