Вот мой код:
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];
Заранее спасибо за ответы и помощь!
@GhoulFool, возможно, этот код уже работает нормально. Рассмотрим, как alert([{}, {}, {}])
отображает [object Object],[object Object],[object Object]
. Возможно, вопрос возник в результате неправильного понимания отображаемой строки.
@ Патрик Робертс то же самое, о чем я думал. поэтому, если theLayer является массивом, это может быть сделано allLayers.push (... theLayer);
@BobWhite Я сомневаюсь, что Photoshop JavaScript поддерживает синтаксис распространения. Коллекции - это даже не массивы, поэтому reduce()
и flat()
не являются функциями.
@PatrickRoberts Думаю, вы правы. Ну что ж, 50 идет насмарку!
@GhoulFool может потратить их на меня;)
@PatrickRoberts Так же легко, как и альтруизм, разве вам не нужен для этого ответ? :)
@GhoulFool, почему бы тебе не посмотреть ответы, размещенные ниже, и не убедиться в этом сам ...
@PatrickRoberts Houston, у нас проблема с обновлением экрана ...
Привет, @GhoulFool! В настоящее время у меня нет Photoshop (после обновления Windows), чтобы проверить свой ответ. Но я думаю, что return Array.from(allLayers).flat()
может помочь. Совместимость из Array.from()
@ rv7 Array.from
не является функцией Photoshop JavaScript.
попробуйте: `` allLayers.join (',');
Как насчет использования allLayers.push(theLayer[0]);
вместо allLayers.push(theLayer);
.
Хорошая попытка! К сожалению, это просто превращает слои массива: [Artlayer 2], [ArtLayer 1], [ArtLayer Background] в слои массива: ,,
Код в вопросе делать отображает одноуровневый массив объектов 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"
Пример concat()
не имеет значения. Как вы отметили, код в вопросе уже правильно генерирует плоский массив.
@PatrickRoberts Я согласен, это не актуально в коде OP; Я решил включить его, потому что заголовок вопроса: «Как сгладить массив в Photoshop?».
Рассматриваемый код уже работает правильно. Ссылаясь на документацию по 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);
вы можете использовать
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);
Вы пытались свести список к рекурсивному результату?
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);
Нет возможности редактировать текст награды? приведенные выше примеры кода стали супер уродливыми!